第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為什么 Go 在寫入關閉的通道時會出現(xiàn)恐慌?

為什么 Go 在寫入關閉的通道時會出現(xiàn)恐慌?

Go
慕森王 2021-12-07 14:47:05
為什么 Go 在寫入關閉的通道時會出現(xiàn)恐慌?雖然可以使用value, ok := <-channel習語從通道讀取,因此可以測試 ok 結果是否命中封閉通道:// reading from closed channelpackage mainimport "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 channelchannel is closedchannel is closed在Playground上運行“從封閉頻道讀取”寫入可能關閉的通道更加復雜,因為如果您只是在通道關閉時嘗試寫入,Go 會恐慌://writing to closed channelpackage mainimport (    "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 channelfunc 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 channelwrite: error writing 3 on channel: send on closed channelwrite: error writing 4 on channel: send on closed channel在Playground上運行“寫入封閉頻道”據(jù)我所知,沒有一個更簡單的習慣用法可以在不驚慌的情況下寫入可能已關閉的通道。為什么不?這種讀寫之間的不對稱行為背后的原因是什么?
查看完整描述

1 回答

?
泛舟湖上清波郎朗

TA貢獻1818條經驗 獲得超3個贊

Go 語言規(guī)范

對于通道 c,內置函數(shù) close(c) 記錄不會在通道上發(fā)送更多值。如果 c 是只接收通道,這是一個錯誤。發(fā)送到或關閉關閉的通道會導致運行時恐慌。關閉 nil 通道也會導致運行時恐慌。在調用 close 之后,并且在接收到任何先前發(fā)送的值之后,接收操作將在不阻塞的情況下返回通道類型的零值。多值接收操作返回接收到的值以及通道是否關閉的指示。

如果你寫入一個封閉的通道,你的程序會崩潰。如果您真的想這樣做,您可能會通過恢復來捕獲此錯誤,但是處于不知道要寫入的通道是否打開的情況通常是程序中存在錯誤的跡象。

一些引用:

這是一個動機:

通道“關閉”實際上只是在通道上發(fā)送特殊值。這是一個特殊的值,承諾不會發(fā)送更多的值。嘗試在關閉后在通道上發(fā)送值會導致恐慌,因為實際發(fā)送值會違反 close 提供的保證。由于關閉只是一種特殊的發(fā)送,因此在通道關閉后也是不允許的。

這是另一個:

通道關閉的唯一用途是向讀者發(fā)出信號,表明沒有更多的值出現(xiàn)。這僅在存在單一值來源或多個來源協(xié)調時才有意義。沒有合理的程序可以讓多個 goroutine 關閉一個通道而不進行通信。這意味著多個 goroutine 會知道沒有更多的值要發(fā)送——如果它們不通信,它們如何確定呢?

(伊恩·蘭斯·泰勒)

——

這是另一個:

關閉通道會將其作為資源釋放。多次關閉通道并不比多次關閉文件描述符或多次釋放分配的內存塊更有意義。此類操作意味著代碼已損壞,這就是關閉關閉的通道會觸發(fā)恐慌的原因。

(羅伯·派克)

——


查看完整回答
反對 回復 2021-12-07
  • 1 回答
  • 0 關注
  • 173 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號