1. 首页
  2. 主题
  3. Go问与答

(<- chan int) 和 (chan int)当函数返回值的区别是什么?

embiid · · 3944 次点击
当用(chan int)用作函数返回值时, 很明显是接收一个chan int, 然后可以进行读写操作 ```go func test1() { ch := returnChan1() defer close(ch) // 输出5 fmt.Println(<- ch) } func returnChan1() (chan int) { ch := make(chan int) go func() { ch <- 5 }() time.Sleep(time.Second) return ch } ``` 我不明白的是(<- chan int)用作函数返回值时, 到底是代表一个int,还是一个chan int ```go func test2() { ch := returnChan2() //defer close(ch) // 语法报错(为什么是一个chan还不能close?) fmt.Printf("test2: %p\n", ch) fmt.Println(<- ch) } func returnChan2() (<- chan int) { ch := make(chan int) go func() { ch <- 5 }() time.Sleep(time.Second) fmt.Printf("returnChan2: %p\n", ch) // return <- r // 语法报错 return ch } ``` 调用test2()的输出为: **returnChan2: 0xc04203c0c0** **test2: 0xc04203c0c0** **5** 我的疑问是: 1. <- chan int 如果返回的是int类型,为什么只能返回chan int类型? 2. <- chan int 如果返回的是chan int类型,虽然能通过<- ch来获取值,但是为什么不能执行close()操作? 3. <- chan int 如果返回的是chan int类型,那(<- chan int)和(chan int)作为函数返回值有什么区别呢?
解决了我的疑问,我说一直deadlock,感谢
#2
更多评论
自己找到答案了: **chan作为函数返回值的方式有3种:(chan int)、(&lt;- chan int)、(chan &lt;- int),分别代表(可读可写的管道)、(只读管道)、(只写管道),只读管道不能close(),只写管道可以close()**
#1
Great! [kids go kart](https://www.xjd.com/)
#3

用户登录

没有账号?注册

今日阅读排行

    加载中

一周阅读排行

    加载中