2 回答
TA贡献1893条经验 获得超10个赞
切片包含指向支持数组的指针。当您通过通道发送切片时,您发送的是对该支持数组的引用,因此在接收端,即使您多次读取切片,您实际上也引用了同一个共享支持数组。
您可以为每次迭代创建一个新切片并将其发送。每个切片都有一个单独的后备数组,并且将按您的预期工作。
TA贡献1898条经验 获得超8个赞
稍微修改您的程序以便更好地阅读。
package main
import "fmt"
import "sync"
func producer(jobs chan []int, wg *sync.WaitGroup) {
defer wg.Done()
a := make([]int, 2)
a[0] = 1
a[1] = 2
jobs <- a //We are passing memory location of slice ( is nature of slice ), so the values changing next line will affect here too
a[0] = 2
a[1] = 3
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()
}
我用 Array 尝试过的相同程序,然后我们将得到您期望的结果,请参见下面的代码
package main
import "fmt"
import "sync"
func producer(jobs chan [2]int, wg *sync.WaitGroup) {
defer wg.Done()
var a[2]int
a[0] = 1
a[1] = 2
jobs <- a
a[0] = 2
a[1] = 3
jobs <- a
close(jobs)
}
func main() {
var wg sync.WaitGroup
wg.Add(1)
jobs := make(chan [2]int)
go producer(jobs, &wg)
for job := range jobs {
fmt.Printf("job: %+v\n", job)
}
wg.Wait()
}
- 2 回答
- 0 关注
- 96 浏览
添加回答
举报