Go 知识点(07)— 对已经关闭通道进行读写
生活随笔
收集整理的這篇文章主要介紹了
Go 知识点(07)— 对已经关闭通道进行读写
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
今天我們來看下對已經關閉通道進行讀寫會發生什么情況。
1. 對已關閉通道進行寫操作
看下面代碼會輸出什么結果?
func main() {ch := make(chan string, 1)close(ch)ch <- "hello, world"fmt.Println(<-ch)
}
輸出結果為:
panic: send on closed channel
這個結果無論對于非緩沖通道還是緩沖通道都是一樣的,即對已經關閉的通道進行寫操作,會觸發 panic 。
2. 對已關閉通道進行讀操作
對已經關閉的 channel 進行讀操作要分為兩種情況:
- 已關閉的
channel沒有數據; - 已關閉的
channel仍然有數據;
2.1 已關閉的 channel 沒有數據
看下面代碼
func main() {ch := make(chan int, 1)close(ch)// 第一次從通道中獲取數據value, ok := <-chfmt.Println(value) // 0fmt.Println(ok) // false// 第二次從通道中獲取數據fmt.Printf("<-ch is %v\n", <-ch) // <-ch is 0fmt.Println(ok) // false
}
從上面代碼結果我們可以得出結論,對于已經關閉的 channel ,如果通道內已經沒有數據,那么可以不限次數的進行讀取操作,但是讀到的值是該 channel 類型的零值,也就是上面代碼中 int 的零值 0。
如果該通道被聲明為 string 類型,那么其零值就為空字符串 ""。
而從通道返回的第二個值,也就是標志位 ok,則會一直為 false 。
2.2 已關閉的 channel 仍然有數據
查看下面代碼輸出結果
func main() {ch := make(chan int, 3)ch <- 1close(ch)// 第一次從通道中獲取數據value, ok := <-chfmt.Println("第一次從通道中獲取數據 value", value) // 1fmt.Println("第一次從通道中獲取數據 ok", ok) // true// 第二次從通道中獲取數據value, ok = <-chfmt.Println("第二次從通道中獲取數據 value", value) // 0fmt.Println("第二次從通道中獲取數據 ok", ok) // false
}
對于這種情況,從通道里面仍然可以獲取到之前存儲的數據,同時第二個返回值 ok 的值為 true, 表示通道里面是有數據的。
但是當通道里面的值被取完時,就和上面 2.1 小節的結果一樣了。
3. 對通道操作的總結
總結
以上是生活随笔為你收集整理的Go 知识点(07)— 对已经关闭通道进行读写的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2022-2028年中国粘网胶行业市场深
- 下一篇: 2022-2028年中国微滤膜行业市场发