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

embiid · 2018-08-01 10:26:10 · 3507 次点击 · 大约8小时之前 开始浏览    置顶
这是一个创建于 2018-08-01 10:26:10 的主题,其中的信息可能已经有所发展或是发生改变。

当用(chan int)用作函数返回值时, 很明显是接收一个chan int, 然后可以进行读写操作

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

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)作为函数返回值有什么区别呢?

有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

3507 次点击  
加入收藏 微博
2 回复  |  直到 2019-06-15 15:03:15
embiid
embiid · #1 · 7年之前

自己找到答案了: chan作为函数返回值的方式有3种:(chan int)、(<- chan int)、(chan <- int),分别代表(可读可写的管道)、(只读管道)、(只写管道),只读管道不能close(),只写管道可以close()

jetamie
jetamie · #2 · 6年之前

解决了我的疑问,我说一直deadlock,感谢

添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传