请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

老师可以帮我看看这个问题吗?是管道chan传值问题

gin中的代码如下:


type msg struct {
	Id uint64
}

type Dispatcher struct {
	WorkerPool   chan chan msg
	MessageQueue chan msg
}

type Worker struct {
	WorkerPool chan chan msg
	JobChannel chan msg
}

func ch() {
	d := Dispatcher{
		WorkerPool:   make(chan chan msg, 5),
		MessageQueue: make(chan msg, 50000),
	}
	w := Worker{
		// 共同指向了一个内存
		WorkerPool: d.WorkerPool,
		JobChannel: make(chan msg, 50000),
	}
	go func() {
		for {
			// 会等待 w.JobChannel 有数据了,并且 w.WorkerPool 有空间了就不会阻塞
			w.WorkerPool <- w.JobChannel
			select {
			case mes := <-w.JobChannel:
				fmt.Println("我执行了 mes", mes, w.JobChannel)
			}
		}
	}()
	go func() {
		for {
			select {
			case job := <-d.MessageQueue:
				fmt.Println("我执行了 job", job, d.MessageQueue)
				go func(mes msg) {
					JobChannel := <-d.WorkerPool
					
					fmt.Println("JobChannel的地址:", JobChannel)
					
					JobChannel <- job
				}(job)
			}
		}
	}()
	d.MessageQueue <- msg{Id: 1000}
}

打印结果是:

我执行了 job {1000} 0xc000500000
JobChannel的地址: 0xc000580000
我执行了 mes {1000} 0xc000580000

为什么管道中的w.JobChannel 可以接收到值? 如下:

select {
			case mes := <-w.JobChannel:
				fmt.Println("我执行了 mes", mes, w.JobChannel)
			}

老师,我可能知道是什么原因了,我觉得应该是这样。

这一句就相当于把 w.WorkerPool 的地址 = w.JobChannel 的地址
所以就可以监听到 mes := <-w.JobChannel

//img1.sycdn.imooc.com//szimg/610a574509322d9b23721182.jpg

就类似这个博客的人问的一样,地址=地址,就可以通过管道获取了

博客地址:

正在回答 回答被采纳积分+3

1回答

提问者 qq_自_3 2021-08-04 16:59:53

老师,我可能知道是什么原因了,我觉得应该是这样。@老师

 这一句就相当于把 w.WorkerPool 的地址 = w.JobChannel 的地址,所以就可以监听到 mes := <-w.JobChannel

//img1.sycdn.imooc.com//szimg/610a574509322d9b23721182.jpg



就类似这个博客的人问的一样,地址=地址,就可以通过管道获取了

博客地址:

https://segmentfault.com/q/1010000016376791


0 回复 有任何疑惑可以回复我~
  • ccmouse #1
    同学的理解是对的。channel的内部实际上是有指针的。channel变量赋值之后,两边都可以访问同一个channel。
    回复 有任何疑惑可以回复我~ 2021-08-08 10:38:37
  • 提问者 qq_自_3 回复 ccmouse #2
    谢谢老师帮忙解答,已解疑惑。
    回复 有任何疑惑可以回复我~ 2021-08-09 16:19:15
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信