Go中涉及通道的以下函数参数之间有什么区别?

时间:2018-01-19 06:49:07

标签: function go arguments channel

此函数参数中包含通道运算符的代码:

func Worker(item <- chan string)

这段代码没有函数参数中的通道运算符:

func Worker(item chan string)

3 个答案:

答案 0 :(得分:5)

  

可选&lt; - 运算符指定通道方向,发送或   接收。如果没有给出方向,则通道是双向的。一个   通道可能仅限于发送或仅接收   转换或转让。

来自golang spec:https://golang.org/ref/spec#Channel_types

答案 1 :(得分:1)

  

func Worker(item&lt; - chan string)

此处item是发送频道。您只能向其发送无法接收的价值。

  

func Worker(item chan string)

此处item是双向渠道。发送和接收都是可能的。

答案 2 :(得分:0)

您可以尝试使用此代码示例来模拟通道方向。

// func Worker(item <- chan string) # Send or Receive
// func Worker(item chan string)    # Bidirectional

func sendOrRecvFunc(item <-chan string, msg *string) {
    *msg = <- item // send
}

func bidirectionalFunc(item chan string, msg string) {
    item <- msg // receive
}

func main() {

    // e.g Send or Receive
    var msg1 string

    item1 := make(chan string,1)

    item1 <- "message1" // receive

    sendOrRecvFunc(item1,&msg1)

    fmt.Println(msg1)

    //---------------------------------------------

    // e.g Bidirectional
    item2 := make(chan string,1)

    bidirectionalFunc(item2,"message2")

    msg2 := <- item2 // send

    fmt.Println(msg2)

}

// Output:
message1
message2