日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

go语言中channel的创建和销毁以及匿名函数的使用

發(fā)布時(shí)間:2025/3/15 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 go语言中channel的创建和销毁以及匿名函数的使用 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

channel的創(chuàng)建

go語言中,任意類型前面加上關(guān)鍵字chan即可聲明對(duì)應(yīng)類型的通道,創(chuàng)建通道需要使用make,make也用于map 和slice的創(chuàng)建
創(chuàng)建一個(gè)通道

/*剛創(chuàng)建的通道是nil*/ var a chan bool a = make(chan bool)

使用匿名函數(shù)創(chuàng)建一個(gè)goroutine

go func() {for i := 1; i < 10; i++ {fmt.Println("子goroutine is running....", i)}// 往通道中寫值a <- truefmt.Println("結(jié)束....") }()

按照阻塞的方式讀取通道中的值

// 讀取的操作是注阻塞的 data := <-a package mainimport "fmt"func main() {/*通道名 channel*//*剛創(chuàng)建的通道是nil*/var a chan boolfmt.Printf("%T,%v\n", a, a)a = make(chan bool)// 使用匿名函數(shù)創(chuàng)建一個(gè)`goroutine`go func() {for i := 1; i < 10; i++ {fmt.Println("子goroutine is running....", i)}a <- truefmt.Println("結(jié)束....")}()fmt.Println("main....over.....")// 讀取的操作是注阻塞的data := <-afmt.Println(data)fmt.Println("channel demo") }

通道關(guān)閉

package mainimport ("fmt""time" )func main() {/*關(guān)閉通道:close(ch)子goroutine;寫10個(gè)數(shù)據(jù)每寫一個(gè),阻塞一次,主goroutine讀取一次 解除阻塞主goroutine 讀取數(shù)據(jù)每次讀取數(shù)據(jù),阻塞一次, 子goroutine每次寫入一個(gè)就解除主阻塞*/cha1 := make(chan int)go sendData1(cha1)//讀取數(shù)據(jù).使用for循環(huán)需要自己判斷是否通道關(guān)閉/* for {v, ok := <-cha1if !ok {fmt.Println("已經(jīng)讀取了所有的數(shù)據(jù)......", ok)break}fmt.Println("讀取的數(shù)據(jù)....", v)}*/// 使用for range就可以讓range自己判斷通道啥時(shí)候關(guān)閉// cha1關(guān)閉的時(shí)候,這里range將停止遍歷for v := range cha1 {fmt.Println("main ..over....", v)}//單向 只能寫數(shù)據(jù),不能讀數(shù)據(jù)//ch1 := make(chan <- int)// 單向只能讀不能寫數(shù)//ch2 := make(<- chan int)fmt.Println("channel close") }func sendData1(cha1 chan int) {for i := 0; i < 10; i++ {time.Sleep(1000 * time.Millisecond)cha1 <- i}close(cha1) }

使用通道進(jìn)行數(shù)據(jù)發(fā)送的小例子
// 1. 創(chuàng)建goroutine1, 向 ch1中發(fā)送1,100個(gè)數(shù)
// 2. 創(chuàng)建goroutine2, 向 ch2中發(fā)送, 1,-1000的平方
// 3. main函數(shù)中從ch2將值取出

package mainimport ("fmt""sync" )// 1. 創(chuàng)建goroutine1, 向 ch1中發(fā)送1,100個(gè)數(shù) // 2. 創(chuàng)建goroutine2, 向 ch2中發(fā)送, 1,-1000的平方 // 3. main函數(shù)中從ch2將值取出var wg1 sync.WaitGroupfunc wg1Fun(ch1 chan int) {defer wg1.Done()for i := 1; i <= 100; i++ {ch1 <- i}close(ch1) }func wg2Fun(ch2 chan int, ch1 chan int) {defer wg1.Done()for {x, ok := <- ch1if !ok {break}ch2 <- x * x}close(ch2) }func main() {var ch1 = make(chan int, 100)var ch2 = make(chan int, 100)wg1.Add(2)go wg1Fun(ch1)go wg2Fun(ch2, ch1)wg1.Wait()for v := range ch2 {fmt.Println("get ch2 is ", v)}}

go語言中,對(duì)已經(jīng)關(guān)閉的通道進(jìn)行取值,能夠取到,只不過取到的ok為false

package mainimport "fmt"// 對(duì)已經(jīng)關(guān)閉的通道進(jìn)行取值,能夠取到不過ok返回的falsefunc main() {ch1 := make(chan bool, 2)ch1 <- truech1 <- true// 關(guān)閉通道close(ch1)<- ch1<- ch1x, ok := <- ch1fmt.Println(x, ok)x, ok = <- ch1fmt.Println(x, ok)x, ok = <- ch1fmt.Println(x, ok) }

總結(jié)

以上是生活随笔為你收集整理的go语言中channel的创建和销毁以及匿名函数的使用的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。