golang channel chan类型传给chan类型

type client chan string
var a = make(chan string)
var b = make(chan client)

func main() {
    go func() {
        a <- "hello"
        fmt.Println("接收a成功")
    }()
    go func() {
        b <- a
        fmt.Println("接收b成功")
    }()

    fmt.Println(a)
    fmt.Println(<-b)
}

上述代码的输出是
0xc00003e060
0xc00003e060
接收b成功

疑问:代码b<-a没有将a的值传给b吗,只是将a的引用传给b?这是为什么呢?

cswyp
最佳答案
代码b<-a是将整个a存入b中,而不是把a的值存入b中。  
1.从前三行代码可知,a是一个string类型的chan,b是一个chan string类型的chan。  
2.b <- a 相当于把整个a作为一个值传进b中,<-b 我们得到的是一个a,所以fmt.Println(a)和fmt.Println(<-b)输出的都是a的地址。  
3.如果我们想拿到a中的值可以这样子输出:fmt.Println(<-<-b),因为有两层chan所以需要两个<-,就可以拿到a的值。
2年前 评论
讨论数量: 1
cswyp
代码b<-a是将整个a存入b中,而不是把a的值存入b中。  
1.从前三行代码可知,a是一个string类型的chan,b是一个chan string类型的chan。  
2.b <- a 相当于把整个a作为一个值传进b中,<-b 我们得到的是一个a,所以fmt.Println(a)和fmt.Println(<-b)输出的都是a的地址。  
3.如果我们想拿到a中的值可以这样子输出:fmt.Println(<-<-b),因为有两层chan所以需要两个<-,就可以拿到a的值。
2年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!