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