下面的代碼工作正常func main() { c := make(chan string) go subRountine(c) fmt.Println(<-c)}func subRountine(c chan string) { c <- "hello"}有沒有其他方法可以在沒有 make 功能的情況下創建頻道?像這樣,但這個示例不起作用func main() { var c chan string go subRountine(c) fmt.Println(<-c)}func subRountine(c chan string) { c <- "hello"}
2 回答

有只小跳蛙
TA貢獻1824條經驗 獲得超8個贊
不!聲明通道與var
創建通道不同。那么你應該創建make
:
var c chan string c = make(chan string)
不同之處在于,現在您可以在底層作用域中創建 c 并在它們之外使用它。
請注意,您不應該以這種方式將冒號放在等號之前。

陪伴而非守候
TA貢獻1757條經驗 獲得超8個贊
長話短說
沒辦法:你必須使用make
.
更多細節
var c chan string
僅僅聲明了一個通道變量,但沒有初始化通道!這是有問題的,因為正如語言規范所說
未初始化通道的值為
nil
.
和
nil
通道永遠不會準備好進行通信。
換句話說,向nil
通道發送和/或接收是阻塞的。盡管nil
通道值可能很有用,但如果您想在通道上執行通道通信(發送或接收),則必須在某個階段初始化通道。
正如 mkopriva 在他的評論中所寫,Go 只提供了一種初始化通道的方法:
可以使用內置函數創建一個新的初始化通道值
make
,該函數將通道類型和可選容量作為參數:make(chan int, 100)
- 2 回答
- 0 關注
- 125 瀏覽
添加回答
舉報
0/150
提交
取消