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
初学者,楼主如果是为了要修改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