chan中传递map数据,传递的是引用

欧阳少辰 ·
实际上Go里面只有值传递,就算表象是传递了引用,其实传递的还是一个指针类型的值。 要表象上去观察值传递或引用传递,看值的类型就行了,基础类型和数组还有指针都是值类型,直接对应在内存里存储实际数据,表现出来就是值传递,而`slice map chan`底层都是复杂的结构体,比如[https://golang.org/pkg/reflect/#SliceHeader](https://golang.org/pkg/reflect/#SliceHeader),结构体有个指针指向的才是真正的数据内容,这个结构体虽然在传递的时候是做的值拷贝,但数据内容都不会因此丢失或篡改,里面指针的值还是指向了实际数据的内存地址,这个引用关系还继续保持着在,还能继续访问原始值。 这样打印一下就能看清楚一点了: ```go fmt.Println(unsafe.Pointer(&bulk)) sliceChan <- bulk e := <-sliceChan fmt.Println(e) fmt.Println(unsafe.Pointer(&e)) ``` 另外指针都可以继续再引用,就是指向指针的指针了。
#1