好久不上博客了~~~
最近在研究golang,关于通道中传递不同类型的数据,按理说通道中传递的都是值的副本,对于值类型的数据,比如int、string等接收方的修改不会影响到发送方的数据,但是对于map、channel、切片这些引用类型的数据,修改接收方的值也会修改发送方发送的值。
1、先使用key为string,value为int的map,发现会有影响
2、使用key为string,value为结构体类型的map,发现接收方的修改不会影响发送方的数据,原因在于在函数中传递结构体是值传递,结合下面这段代码,在处理过程中发生了值的拷贝
3、但如果是value是结果体的指针,则就能够影响了,就是因为是指针造成了即使是复制操作仍然能够副本影响原来的值
counter := elem["count"]
counter.Count++
type Counter struct {
Count int
}
func (counter *Counter) String() string {
return fmt.Sprintf("Count:%d", counter.Count)
}
var mapChan = make(chan map[string]*Counter, 1)
func main() {
//beego.Run()
syncChan := make(chan struct{}, 2)
//接收
go func() {
for {
if elem, ok := <- mapChan; ok {
//fmt.Println("receive map %v", elem)
counter := elem["count"]
counter.Count++
} else {
break
}
}
syncChan <- struct{}{}
}()
//发送
go func() {
countMap := map[string]*Counter{
"count":&Counter{
Count:0,
},
}
for i := 0; i < 10; i++ {
mapChan <- countMap
time.Sleep(time.Second)
fmt.Println("send map ", countMap)
}
close(mapChan)
syncChan <- struct{}{}
}()
<- syncChan
<- syncChan
}