【发布时间】:2020-08-09 14:04:38
【问题描述】:
我在迭代 golang 无缓冲通道时遇到了令人困惑的输出。
频道定义为chan []int。
然后我将两个切片推送到通道,[0 1] 和 [2 3]。但是当我从频道中获取元素时,我得到了 [2 3] 和 [2 3]。为什么会这样?
package main
import "fmt"
import "sync"
func producer(jobs chan []int, wg *sync.WaitGroup) {
defer wg.Done()
a := make([]int, 2)
index := 0
for i := 0; i < 4; i++ {
a[index] = i
index++
if index == 2 {
index = 0
fmt.Printf("a: %+v\n", a)
jobs <- a
}
}
close(jobs)
}
func main() {
var wg sync.WaitGroup
wg.Add(1)
jobs := make(chan []int, 2)
go producer(jobs, &wg)
for job := range jobs {
fmt.Printf("job: %+v\n", job)
}
wg.Wait()
}
预期输出:
a: [0 1]
a: [2 3]
job: [0 1]
job: [2 3]
实际输出:
a: [0 1]
a: [2 3]
job: [2 3]
job: [2 3]
【问题讨论】:
-
在
jobs <- a之后添加a = make([]int, 2) -
此代码编译错误,我认为需要在第 29 行进行修改(从
go producer(ch, &wg)到go producer(jobs, &wg)