golang channel赋值是共享的吗

在看etcd raft的代码时,node.run()中的readyc变量也是赋值为node.readyc。
同样的道理,当往readyc中put Ready时,那么也可以从node.readyc中读取到数据。

做了一个实验:下面的代码创建了一个channel c,以及一个包含channel ch的结构体node。
将c赋值给node.ch。然后将数据放入c中,为什么可以从node.ch中取出数据?
难道通道是共享的?但是打印地址显示出并不是同样的地址。

func main() {
    c := make(chan int)

    n := &node{
        ch: make(chan int),
    }

    fmt.Println("c:", &c)
    fmt.Println("n:", &n.ch)

    // 赋值
    c = n.ch

    fmt.Println("c:", &c)
    fmt.Println("n:", &n.ch)

    // 往c中添加数据
    go func() {
        c <- 1
        c <- 2
    }()

    // 从c中可以获取数据
    e := <-c
    fmt.Println("v1:", e)

    // 从n.ch中也可以获取数据
    d := <-n.ch
    fmt.Println("v2:", d)

    fmt.Println("c:", &c)
    fmt.Println("n:", &n.ch)
}

type node struct {
    ch chan int
}

示例输出:

c: 0xc42000c028
n: 0xc42000c030
c: 0xc42000c028
n: 0xc42000c030
v1: 1
v2: 2
c: 0xc42000c028
n: 0xc42000c030
阅读 7k
2 个回答

chan类型背后是指针
把c和node.ch看成指针
那么&c&node.ch就都是对指针取地址
那么ch和node.ch的内存在创建变量时(栈上分配)就已经分配好了,不会变

  1. chan 本来就是指针了。
c := make(chan int)

c就是指针。
如果你是 &c 那就是 c的指针的指针,所以你看到的赋值后,指针的指针地址没变。

  1. 赋值后,其实是 c变成了 n.ch 。这俩是一个指针了。
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏