淺析Golang如何向已關(guān)閉的chan讀寫數(shù)據(jù)
1. 向已關(guān)閉的chan寫
會直接panic,報 send to close channel錯誤
package main func main() { // 創(chuàng)建緩沖區(qū)為4的字符串chan schoolChan := make(chan string, 4) // 放入3個值 schoolChan <- "國防科大" schoolChan <- "北京大學(xué)" schoolChan <- "湖南大學(xué)" // 關(guān)閉chan close(schoolChan) // 嘗試寫數(shù)據(jù),會panic: send to close channel schoolChan <- "中南大學(xué)" }
2. 向已關(guān)閉的chan讀
會返回2個值,若已關(guān)閉的chan中還存在值,第二個值為true,第一個值為對應(yīng)的chan中的值,若已關(guān)閉的chan中不存在值,第二個值為false,第一個值為對應(yīng)chan類型的零值
package main import "fmt" func main() { // 創(chuàng)建緩沖區(qū)為4的字符串chan schoolChan := make(chan string, 4) // 放入3個值 schoolChan <- "國防科大" schoolChan <- "北京大學(xué)" schoolChan <- "湖南大學(xué)" // 關(guān)閉chan close(schoolChan) // 向已關(guān)閉的chan讀 if school, isEmpty := <-schoolChan; isEmpty { fmt.Println("school:", school) } // 向已關(guān)閉的chan讀 if school, isEmpty := <-schoolChan; isEmpty { fmt.Println("school:", school) } // 向已關(guān)閉的chan讀 if school, isEmpty := <-schoolChan; isEmpty { fmt.Println("school:", school) } // 向若chan不存在元素,則第二個參數(shù)的值為 false if school, isEmpty := <-schoolChan; isEmpty { fmt.Println("school:", school) } }
使用for循環(huán)遍歷chan,若chan未關(guān)閉則會堵塞等待chan放入元素,如chan關(guān)閉則取出chan內(nèi)所有元素并終止循序
package main import ( "fmt" ) func main() { // 創(chuàng)建緩沖區(qū)為4的字符串chan schoolChan := make(chan string, 4) // 放入3個值 schoolChan <- "國防科大" schoolChan <- "北京大學(xué)" schoolChan <- "湖南大學(xué)" // 關(guān)閉chan close(schoolChan) // for循環(huán)遍歷channel,會將已關(guān)閉的chan中緩沖區(qū)的數(shù)據(jù)取出完后終止循序 for school := range schoolChan { fmt.Println("school:", school) } }
到此這篇關(guān)于淺析Golang如何向已關(guān)閉的chan讀寫數(shù)據(jù)的文章就介紹到這了,更多相關(guān)Go向已關(guān)閉chan讀寫數(shù)據(jù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!