淺析Golang如何向已關(guān)閉的chan讀寫(xiě)數(shù)據(jù)
1. 向已關(guān)閉的chan寫(xiě)
會(huì)直接panic,報(bào) send to close channel錯(cuò)誤
package main
func main() {
// 創(chuàng)建緩沖區(qū)為4的字符串chan
schoolChan := make(chan string, 4)
// 放入3個(gè)值
schoolChan <- "國(guó)防科大"
schoolChan <- "北京大學(xué)"
schoolChan <- "湖南大學(xué)"
// 關(guān)閉chan
close(schoolChan)
// 嘗試寫(xiě)數(shù)據(jù),會(huì)panic: send to close channel
schoolChan <- "中南大學(xué)"
}
2. 向已關(guān)閉的chan讀
會(huì)返回2個(gè)值,若已關(guān)閉的chan中還存在值,第二個(gè)值為true,第一個(gè)值為對(duì)應(yīng)的chan中的值,若已關(guān)閉的chan中不存在值,第二個(gè)值為false,第一個(gè)值為對(duì)應(yīng)chan類(lèi)型的零值
package main
import "fmt"
func main() {
// 創(chuàng)建緩沖區(qū)為4的字符串chan
schoolChan := make(chan string, 4)
// 放入3個(gè)值
schoolChan <- "國(guó)防科大"
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不存在元素,則第二個(gè)參數(shù)的值為 false
if school, isEmpty := <-schoolChan; isEmpty {
fmt.Println("school:", school)
}
}
使用for循環(huán)遍歷chan,若chan未關(guān)閉則會(huì)堵塞等待chan放入元素,如chan關(guān)閉則取出chan內(nèi)所有元素并終止循序
package main
import (
"fmt"
)
func main() {
// 創(chuàng)建緩沖區(qū)為4的字符串chan
schoolChan := make(chan string, 4)
// 放入3個(gè)值
schoolChan <- "國(guó)防科大"
schoolChan <- "北京大學(xué)"
schoolChan <- "湖南大學(xué)"
// 關(guān)閉chan
close(schoolChan)
// for循環(huán)遍歷channel,會(huì)將已關(guān)閉的chan中緩沖區(qū)的數(shù)據(jù)取出完后終止循序
for school := range schoolChan {
fmt.Println("school:", school)
}
}到此這篇關(guān)于淺析Golang如何向已關(guān)閉的chan讀寫(xiě)數(shù)據(jù)的文章就介紹到這了,更多相關(guān)Go向已關(guān)閉chan讀寫(xiě)數(shù)據(jù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Go語(yǔ)言開(kāi)發(fā)前后端不分離項(xiàng)目詳解
這篇文章主要為大家介紹了Go語(yǔ)言開(kāi)發(fā)前后端不分離項(xiàng)目詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-11-11
go獲取協(xié)程(goroutine)號(hào)的實(shí)例
這篇文章主要介紹了go獲取協(xié)程(goroutine)號(hào)的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-12-12
Golang連接Redis數(shù)據(jù)庫(kù)的方法
這篇文章主要介紹了Golang連接Redis數(shù)據(jù)庫(kù)的方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-12-12
一步步教你編寫(xiě)可測(cè)試的Go語(yǔ)言代碼
相信每位編程開(kāi)發(fā)者們應(yīng)該都知道,Golang作為一門(mén)標(biāo)榜工程化的語(yǔ)言,提供了非常簡(jiǎn)便、實(shí)用的編寫(xiě)單元測(cè)試的能力。本文通過(guò)Golang源碼包中的用法,來(lái)學(xué)習(xí)在實(shí)際項(xiàng)目中如何編寫(xiě)可測(cè)試的Go代碼。有需要的朋友們可以參考借鑒,下面跟著小編一起去學(xué)習(xí)學(xué)習(xí)吧。2016-11-11
Golang自動(dòng)追蹤GitHub上熱門(mén)AI項(xiàng)目
這篇文章主要為大家介紹了Golang自動(dòng)追蹤GitHub上熱門(mén)AI項(xiàng)目,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-12-12
go語(yǔ)言題解LeetCode1275找出井字棋的獲勝者示例
這篇文章主要為大家介紹了go語(yǔ)言題解LeetCode1275找出井字棋的獲勝者示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-01-01
Golang中切片長(zhǎng)度和容量的區(qū)別示例詳解
切片長(zhǎng)度與容量在Go中很常見(jiàn),切片長(zhǎng)度是切片中可用元素的數(shù)量,而切片容量是從切片中第一個(gè)元素開(kāi)始計(jì)算的底層數(shù)組中的元素?cái)?shù)量,這篇文章主要給大家介紹了關(guān)于Golang中切片長(zhǎng)度和容量區(qū)別的相關(guān)資料,需要的朋友可以參考下2024-01-01

