Slice使用的一个问题

buaatianwanli · · 1764 次点击
初学者,楼主如果是为了要修改data值,那么channel应该定义为*Data,运行后的结果就是会被修改。 ``` channel := make(chan *Data) data := &Data{A: make([]int32, 0, 1), B: make([]string, 0, 1)} ``` 至于为什么地址没有变的问题,楼主我们你是故意的么,%p,打印的是传参也是传值得啊,你每次都copy当然都是一样的啊。 请看下面的代码: var s []int fmt.Printf("\t %v - %p - %p\n", s, s, &s) s = make([]int, 0, 1) fmt.Printf("\t %v - %p - %p\n", s, s, &s) s = append(s, 1) fmt.Printf("\t %v - %p - %p\n", s, s, &s) copy := s fmt.Printf("\t %v - %p - %p\n", copy, copy, &copy) 输出结果为: [] - 0x0 - 0xc08200a740 [] - 0xc082002370 - 0xc08200a740 [1] - 0xc082002370 - 0xc08200a740 [1] - 0xc082002370 - 0xc08200a820 s定义的是时候是nil,所以%p打印的时候的是nil,但是地址是有的,这个地址在用make初始化之后不变,但是值已经变了,不再是nil了,但是在append值之后,也是不会变的,但是地址变了啊。 最后一行,如果做一个copy,值仍然是相等的啊,所以不变,但是呢地址已经变了啊。 所以回到你的问题,你要定位问题,请把传递给printf的参数%p的变量加个&。
#4
更多评论
各位大拿给出宝贵意见
#1
hua666777
程序猿钱多活少。
看起来好难1
#2