go - 将 slice 传递到 channel 中

标签 go

我正在尝试将修改 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/

相关文章:

go - 对潜在变量范围(也许是指针)的困惑?不确定

go - 用于动态枚举访问的 Protobuf API

go - 这个空的 select-case-default 代码块有什么作用?

go - 试图理解闭包

google-app-engine - Go 中使用 GAE 数据存储时,指向 slice 的指针 "relationships"是否正常?

go - 是否需要调用 db.Close()?

go - 编码时转换值

Golang JSON 数组

javascript - 在以太坊区 block 链上保存合约数据的更有效方式是什么?

concurrency - GoLang教程中的死锁错误