Golang中国

joeonly

Golang China 第 6152 号会员,加入于 2016-10-08 00:42


joeonly最近回复了


回复了 songleo 创建的主题: golang死锁问题(fatal error: all goroutines are asleep - deadlock!) 2016-11-19 23:21

f1是死循环。
这个示例的chan相关处理不完整,只有消费者,没有生产者。

回复了 gogo 创建的主题: 怎样把一个结构体转换成相应的map结构? 2016-11-19 23:17

“这样的要求是否可以 struct 》 json 》 map ?这样简单的命令就可以完成吧?”
正解。

回复了 gogo 创建的主题: 怎样把一个结构体转换成相应的map结构? 2016-11-19 23:17

“这样的要求是否可以 struct 》 json 》 map ?这样简单的命令就可以完成吧?”
正解。

回复了 gomgo 创建的主题: go chan 的顺序 为什么是这样的? 2016-11-19 23:15

感觉楼主对线程和协程还没有基本的认识,建议还是先看些书理解下时间成本会低些。网上讨论效率低很多。

回复了 1007426133 创建的主题: go 编译一次出错后,改了在编译总是提示和第一次出错的提示 2016-11-18 11:41

应该与GO无关,感觉是IDE的问题。

回复了 shook 创建的主题: Golang的指针赋值有没有更方便的方法? 2016-10-30 02:49

问题是解决了,但为取字符串地址加一个方法总有点别扭吧?我更愿意加个工厂方法。

另外大家为什么那么喜欢 new 一个东西,是为了直观吗?如果不是,个人感觉如果不加工厂方法,是不是用
&Test{Name: StringPtr("zhangsan")}
更方便?

个人觉得 GO 的上面这种写法比 JAVA 构造函数的方式还方便,想初始化哪个字段就初始化哪个,不用搞那么多重载。

回复了 ssqq 创建的主题: 既然 slice 是指针,为什么不能原地修改 2016-10-24 00:12

其实不管书上怎么说(看了好几本,记得都是说array做参数时是值传递),开发者最关心的还是里面的元素的使用问题(修改时是否会对原值有影响)。下面这个测试,不管被调用的用数组还是切片,结果都是一样的,这一点有点出乎我的意料。不管如何,数组元素值被改变了,这一点很重要,也是我们想做的。

package main

import "fmt"

type MyStruct struct {
    Name string
}

func change_array(s []MyStruct) {
    //println(&s)
    println(&(s[0]))
    s = s[1:]
}

func change_array_item(s []MyStruct) {
    //println(&s)
    println(&(s[0]))
    s[0].Name = "NewName"
}

func main() {
    doArray()
}

func doArray() {
    x := []MyStruct{MyStruct{"OldName1"}, MyStruct{"OldName2"}}
    //println(&x)
    println(&(x[0]))

    change_array(x)
    //println(x[0].Name, x[1].Name)
    fmt.Println(x)

    change_array_item(x)
    //println(x[0].Name, x[1].Name)
    fmt.Println(x)
}

一个输出的例子:

0x10a180f0
0x10a180f0
[{OldName1} {OldName2}]
0x10a180f0
[{NewName} {OldName2}]

重点在于后面那个NewName,是反映到原值的(如果用int没那么明显,我特意改成结构了)。其实数组有几个我不关心,我最关心里面的结构体对应的值到底有几份。目前看下来是一份,但是被多处引用了,这很重要。你引用满天飞是你语言的事,但是值不满天飞就好。要知道,在类似JAVA这种语言里,那可能就是一个受管理的对象,是一个bean,是一个单例,是真正占用很多内存的“对象”,不是一个几字节的指针那么小的东西。我不希望GO在这方面做得太次)。

打印指针的输出我屏蔽了,想想也是,那只是不同的指针变量,它们的指向也许相同,但它们本身的地址本来就应该是不同的,没必要去纠结了。

回复了 ssqq 创建的主题: 既然 slice 是指针,为什么不能原地修改 2016-10-23 23:13

我刚学GO,也不大用C,但即使从JAVA的角度看,你的第6行
s = ...
是一个很不应该做的动作,甚至类似 findbugs 这种工具都会指出你的行为容易导致 bug 。原因是你改变了参数的引用,而这种场合用一个新的变量是比较合适的,否则容易引起混乱。不管你原来的目的是什么(在这里,你的目的是想把改变反映到调用处),这时候s都不应该由于你想省略一个变量的声明而导致的使用上的混乱。

我们平时为了减少变量的声明,确实会改变变量的引用,但一定要避免引起混乱,例如只限定在临时变量上。因为如果只是改变普通变量的引用的话,并不象改变参数的引用那样会有静态检查的工具来提示你。

回复了 joeonly 创建的主题: 请问map为什么不能作为匿名成员继承 2016-10-23 17:06

我的本意倒不是讨论能不能实现的事。
而是我学习的时候有个习惯,开始只有看不懂的代码才动手实践,后来发现GO比较特殊,为了练手,继承的例子也想试试(刚好白天也与朋友讨论过),结果一不小心举了map的例子。

回复了 joeonly 创建的主题: 请问map为什么不能作为匿名成员继承 2016-10-22 17:55

谢谢回答。按这个思路,功能达到了,不过看上去是不是有点不自然?而且直接声明非匿名变量也达到此功能,那样代码要简单。

我上面之所以折腾是因为MyMap只能添加方法而不能添加数据成员,导致的结果是只为map起了个别名,很难添加其它功能。

package main

type MyMap map[string]string

func (this *MyMap) get(key string) string {
    return (*this)[key]
}

func (this *MyMap) put(key string, value string) {
    (*this)[key] = value
}

type MyStruct struct {
    MyMap
    name string
}

func main() {
    mp := MyStruct{MyMap{}, "aa"}
    mp.put("bb", "cc")
    println(mp.name)
    println(mp.get("no_this_key"))
    println(mp.get("bb"))
}

输出

aa

cc
joeonly 创建的更多回复