在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問答/GO/ golang channel賦值是共享的嗎

golang channel賦值是共享的嗎

在看etcd raft的代碼時,node.run()中的readyc變量也是賦值為node.readyc。
同樣的道理,當(dāng)往readyc中put Ready時,那么也可以從node.readyc中讀取到數(shù)據(jù)。

做了一個實驗:下面的代碼創(chuàng)建了一個channel c,以及一個包含channel ch的結(jié)構(gòu)體node。
將c賦值給node.ch。然后將數(shù)據(jù)放入c中,為什么可以從node.ch中取出數(shù)據(jù)?
難道通道是共享的?但是打印地址顯示出并不是同樣的地址。

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中添加數(shù)據(jù)
    go func() {
        c <- 1
        c <- 2
    }()

    // 從c中可以獲取數(shù)據(jù)
    e := <-c
    fmt.Println("v1:", e)

    // 從n.ch中也可以獲取數(shù)據(jù)
    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
回答
編輯回答
憶當(dāng)年

chan類型背后是指針
把c和node.ch看成指針
那么&c&node.ch就都是對指針取地址
那么ch和node.ch的內(nèi)存在創(chuàng)建變量時(棧上分配)就已經(jīng)分配好了,不會變

2018年9月17日 03:34