将切片传递到通道中

时间:2014-07-11 18:12:35

标签: go

我试图将切片的结果传递到通道中。这是明显破碎的版本。我尝试过几种方法,但似乎效果不好。我正在寻找解决这个问题的惯用方法。

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]

1 个答案:

答案 0 :(得分:7)

它不起作用,因为底层数组是相同的。所以你正在修改相同的内存。

这是一个工作示例。每轮复制记忆。

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]