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

来源:11-1 channel

qq_自_3

2021-08-04

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

//img.mukewang.com/szimg/610a574509322d9b23721182.jpg

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

博客地址:

写回答

1回答

qq_自_3

提问者

2021-08-04

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

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

//img.mukewang.com/szimg/610a574509322d9b23721182.jpg



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

博客地址:

https://segmentfault.com/q/1010000016376791


0
2
qq_自_3
回复
ccmouse
谢谢老师帮忙解答,已解疑惑。
2021-08-09
共2条回复

Google资深工程师深度讲解Go语言 由浅入深掌握Go语言

语法+分布式爬虫实战 为转型工程师量身打造

5995 学习 · 1909 问题

查看课程