go语言中channel的创建和销毁以及匿名函数的使用
生活随笔
收集整理的這篇文章主要介紹了
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è)通道
使用匿名函數(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將值取出
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)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: go语言buffio与继承
- 下一篇: 【软件质量】变更管理与可追踪性