爲什麼Go在寫封閉頻道時恐慌?爲什麼圍棋寫封閉頻道會驚慌?
儘管人們可以使用value, ok := <-channel
成語用於從信道讀取,因此,確定的結果可用於擊打一個封閉的通道進行測試:
// reading from closed channel
package main
import "fmt"
func main() {
ch := make(chan int, 1)
ch <- 2
close(ch)
read(ch)
read(ch)
read(ch)
}
func read(ch <-chan int) {
i,ok := <- ch
if !ok {
fmt.Printf("channel is closed\n")
return
}
fmt.Printf("read %d from channel\n", i)
}
輸出:
read 2 from channel
channel is closed
channel is closed
運行「從讀關閉頻道「在Playground
寫入一個可能關閉的頻道更加複雜,因爲如果您只是試圖wri,Go會驚慌TE當通道被關閉:
//writing to closed channel
package main
import (
"fmt"
)
func main() {
output := make(chan int, 1) // create channel
write(output, 2)
close(output) // close channel
write(output, 3)
write(output, 4)
}
// how to write on possibly closed channel
func write(out chan int, i int) (err error) {
defer func() {
// recover from panic caused by writing to a closed channel
if r := recover(); r != nil {
err = fmt.Errorf("%v", r)
fmt.Printf("write: error writing %d on channel: %v\n", i, err)
return
}
fmt.Printf("write: wrote %d on channel\n", i)
}()
out <- i // write on possibly closed channel
return err
}
輸出:
write: wrote 2 on channel
write: error writing 3 on channel: send on closed channel
write: error writing 4 on channel: send on closed channel
運行「寫入封閉通道」上Playground
據我所知,目前還沒有寫一個簡單的成語進入可能封閉的通道而不會發生恐慌。爲什麼不?讀寫之間這種不對稱行爲背後的原因是什麼?
我們怎麼會知道?向谷歌golang組詢問,也許其中一位作者會回答你。我可以想到一個原因。這只是一個很好的設計來關閉製作方的頻道。恐慌迫使你以這種方式設計你的應用程序。 – creker
關閉一個頻道是一個信號,在這裏將沒有更多的價值。寫入一個封閉的渠道是一個程序錯誤,這恐慌。 – JimB