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
就类似这个博客的人问的一样,地址=地址,就可以通过管道获取了
博客地址: