教程集 www.jiaochengji.com
教程集 >  Golang编程  >  golang教程  >  正文 golang channel传递map

golang channel传递map

发布时间:2021-12-11   编辑:jiaochengji.com
教程集为您提供golang channel传递map等资源,欢迎您收藏本站,我们将为您提供最新的golang channel传递map资源

好久不上博客了~~~

最近在研究golang,关于通道中传递不同类型的数据,按理说通道中传递的都是值的副本,对于值类型的数据,比如int、string等接收方的修改不会影响到发送方的数据,但是对于map、channel、切片这些引用类型的数据,修改接收方的值也会修改发送方发送的值。

1、先使用key为string,value为int的map,发现会有影响

2、使用key为string,value为结构体类型的map,发现接收方的修改不会影响发送方的数据,原因在于在函数中传递结构体是值传递,结合下面这段代码,在处理过程中发生了值的拷贝

3、但如果是value是结果体的指针,则就能够影响了,就是因为是指针造成了即使是复制操作仍然能够副本影响原来的值

<pre class="has"><code class="language-Go">counter := elem["count"] counter.Count </code></pre> <pre class="has"><code class="language-Go">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 }</code></pre>

 

到此这篇关于“golang channel传递map”的文章就介绍到这了,更多文章或继续浏览下面的相关文章,希望大家以后多多支持JQ教程网!

您可能感兴趣的文章:
golang channel传递map
golang 没有名字参数_说说不知道的Golang中参数传递
Golang从入门到放弃200618--Map(1)Map的初始化和基本操作
golang map笔记
Golang Channel原理
Golang精编面试题 -- 选择题
golang知识点
go channel 缓冲区最大限制_Golang 入门 : channel(通道)
Go语言并发模型:以并行处理MD5为例
golang key map 所有_golang推断map中指定key是不是存在_后端开发

[关闭]
~ ~