golang channel传递map

好久不上博客了~~~

最近在研究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

}

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值