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