2016-11-14 99 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有很大的幫助。謝謝 :) –

相關問題