我正在尝试将修改 slice 的结果传递到 channel 中。这是明显损坏的版本。我尝试了几种似乎效果不佳的方法。我正在寻找一种惯用的方法来解决这个问题。
func gen() <-chan []int {
c := make(chan []int)
go func(c chan []int) {
defer close(c)
s := []int{0, 1, 2, 3}
for i := 0; i < len(s); i++ {
s[i] = -1
c <- s
}
}(c)
return c
}
func main() {
for s := range gen() {
fmt.Println(s)
}
}
结果:
[-1 -1 2 3]
[-1 -1 2 3]
[-1 -1 -1 -1]
[-1 -1 -1 -1]
最佳答案
它不起作用,因为底层数组是相同的。所以你正在修改相同的内存。
这是一个工作示例。在每一轮复制内存。
http://play.golang.org/p/OXfKVg8ZlZ
package main
import "fmt"
func gen() <-chan []int {
c := make(chan []int)
go func(c chan []int) {
defer close(c)
s := []int{0, 1, 2, 3}
for i := 0; i < len(s); i++ {
s[i] = -1
newSlice := make([]int, len(s))
copy(newSlice, s)
c <- newSlice
}
}(c)
return c
}
func main() {
for s := range gen() {
fmt.Println(s)
}
}
输出
[-1 1 2 3]
[-1 -1 2 3]
[-1 -1 -1 3]
[-1 -1 -1 -1]
关于go - 将 slice 传递到 channel 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24703943/