2016-11-14 29 views
1

我们可以在Go lang中两次启动一个decalred频道吗?为什么同一个Go频道不能启动两次?

package main 

import (
    "fmt" 
) 

func emit(c chan string) { 

    words := []string {"The", "quick", "brown", "fox"} 

    for _, word := range words { 
     c <- word 
    } 
    close(c) 
} 

在main函数,如果我尝试使用相同的通道两次我得到该通道的默认值

func main() { 

    wordChannel := make(chan string) 

    go emit(wordChannel) 

    for word := range wordChannel { 
     fmt.Printf("%s ", word) 
    } 

    go emit(wordChannel) 
    word1 := <-wordChannel 
    fmt.Printf("%s" , word1) // prints Default value 
} 

Output

所以再次使用它,我来宣布另一个频道。 如果这不是一个错误,为什么这是在Go Lang中完成的。 ? 我使用去琅版本1.6

回答

5

通道未“启动”,渠道只是存在,有两种状态:

  • “开放”,在这种情况下,您可以发送值,将其(并接收发送的值)或
  • “关闭”,其中您无法发送和接收来自封闭通道的结果为“零值,假”。

一旦封闭的渠道永远保持关闭。所以是的,你必须make一个新的频道,Go没有“重新打开”。

+0

现在变得清楚,现在开放和关闭状态。正确Terminiolgy有很大的帮助。谢谢 :) –

相关问题