在玩 Go 的通道和例程時,我遇到了一種奇怪的行為,我希望有人能解釋一下。下面是一個簡短的程序,它應該通過通道將字符串發送到在單獨的 goroutine 中運行的“偵聽器”(select 語句),從而將幾個字符串打印到標準輸出。package mainimport ( "fmt" "time")func main() { a := make(chan string) go func() { for { select { case <-a: fmt.Print(<-a) } } }() a <- "Hello1\n" a <- "Hello2\n" a <- "Hello3\n" a <- "Hello4\n" time.Sleep(time.Second) }使用go func() { for s := range a { fmt.Print(s) }}()// or even simplergo func() { for { fmt.Print(<-a) }}()按預期工作。但是,使用 select 語句運行最上面的代碼段會產生以下輸出:Hello2Hello4即只打印所有其他語句。這是什么魔法?
3 回答

不負相思意
TA貢獻1777條經驗 獲得超10個贊
<-a
破壞性地從通道中獲取一個值。所以在你的代碼中你得到兩個值,一個在 select 語句中,一個用于打印。select 語句中收到的那個沒有綁定到任何變量,因此丟失了。
嘗試
select {
case val := <-a:
fmt.Print(val)
相反,要僅獲取一個值,請將其綁定到變量 val,然后將其打印出來。
- 3 回答
- 0 關注
- 252 瀏覽
添加回答
舉報
0/150
提交
取消