初级会员
  • 第 4505 位会员
  • txgo
  • tx@zixuntouzi.com
  • 2016-02-25 10:15:37
  • Offline
  • 0

最近发布的文章

    暂无

最近分享的资源

    暂无

最近发布的项目

    暂无

最近的评论

  • 评论了主题 Slice使用的一个问题
    我明白了,这个问题不是struct的值对应的slice是否变化的问题,本质是slice的底层数组表示。 你可能也注意到了,如果使用s = append(s, 1)和s[0]=1结果不太一样,对吧? 请看这段代码: ``` package main import ( "fmt" ) func main() { 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) copy[0] = 2 fmt.Printf("\t %v - %p - %p\n", copy, copy, &copy) fmt.Printf("\t %v - %p - %p\n", s, s, &s) } ``` 运行结果是: ``` [] - 0x0 - 0xc820056080 [] - 0xc82005c1c0 - 0xc820056080 [1] - 0xc82005c1c0 - 0xc820056080 [1] - 0xc82005c1c0 - 0xc820056180 [2] - 0xc82005c1c0 - 0xc820056180 [2] - 0xc82005c1c0 - 0xc820056080 ``` 也就是被copy变量和原变量是共用了底层数组,所以修改copy之后,原来的slice也会被修改(直到超出容量之后重新分配底层数组)。
  • 评论了主题 Slice使用的一个问题
    同学,我还有一个意思是你的printf打印地址用错了!打印值v的地址要用&v,而不是v。所以你打印出来都是一样的,而且我用了一段代码来演示打印地址的时候用v和&v的区别。
  • 评论了主题 Slice使用的一个问题
    @buaatianwanli 可能是我没有说清楚,我的意思是你的打印了s的值,这个值是不变的,而实际上要打印的是s的地址,这个地址在复制的时候是变化的。你的代码使用channel传递的是值,在go routine对这个复制的值进行了修改,而在main routine中原来的值当然不受影响啦。
  • 评论了主题 Slice使用的一个问题
    初学者,楼主如果是为了要修改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的变量加个&。