Slice使用的一个问题

buaatianwanli · · 1563 次点击 · 开始浏览    置顶
这是一个创建于 的主题,其中的信息可能已经有所发展或是发生改变。

package main import ( "fmt" "sync" ) type Data struct { A []int32 B []string } func main() { channel := make(chan Data) data := Data{A: make([]int32, 0, 1), B: make([]string, 0, 1)} fmt.Printf("Before gorountine addr, A: %p\n", data.A) fmt.Printf("Before gorountine addr, B: %p\n", data.B) wg := new(sync.WaitGroup) wg.Add(1) go func() { for d := range channel { fmt.Printf("goroutine addr before append, A: %p\n", d.A) fmt.Printf("goroutine addr before append, B: %p\n", d.B) d.A = append(d.A, 23) d.B = append(d.B, "23") //d.A[0] = 23 //d.B[0] = "23" fmt.Printf("goroutine addr after append, A: %p\n", d.A) fmt.Printf("goroutine addr after append, B: %p\n", d.B) fmt.Println(d) } wg.Done() }() fmt.Printf("Before: %v\n", data) channel <- data close(channel) wg.Wait() fmt.Printf("After gorountine addr, A: %p\n", data.A) fmt.Printf("After gorountine addr, B: %p\n", data.B) fmt.Printf("After: %v\n", data) } 代码见上 输出见下: Before gorountine addr, A: 0xc20800a1dc Before gorountine addr, B: 0xc20800a200 Before: {[] []} goroutine addr before append, A: 0xc20800a1dc goroutine addr before append, B: 0xc20800a200 goroutine addr after append, A: 0xc20800a1dc goroutine addr after append, B: 0xc20800a200 {[23] [23]} After gorountine addr, A: 0xc20800a1dc After gorountine addr, B: 0xc20800a200 After: {[] []} 我的问题是:为什么slice的地址没有变,但是master goroutine里的data数据为空? 如果我去掉append,改为直接赋值,最后data则不为空 需要注意的是,我在make slice的时候特地设置cap为1

有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

1563 次点击  ∙  2 赞  
加入收藏 微博
18 回复  |  直到 2016-03-07 09:06:17
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传