go语言中channel的创建和销毁以及匿名函数的使用
生活随笔
收集整理的這篇文章主要介紹了
go语言中channel的创建和销毁以及匿名函数的使用
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
channel的創建
go語言中,任意類型前面加上關鍵字chan即可聲明對應類型的通道,創建通道需要使用make,make也用于map 和slice的創建
創建一個通道
使用匿名函數創建一個goroutine
go func() {for i := 1; i < 10; i++ {fmt.Println("子goroutine is running....", i)}// 往通道中寫值a <- truefmt.Println("結束....") }()按照阻塞的方式讀取通道中的值
// 讀取的操作是注阻塞的 data := <-a package mainimport "fmt"func main() {/*通道名 channel*//*剛創建的通道是nil*/var a chan boolfmt.Printf("%T,%v\n", a, a)a = make(chan bool)// 使用匿名函數創建一個`goroutine`go func() {for i := 1; i < 10; i++ {fmt.Println("子goroutine is running....", i)}a <- truefmt.Println("結束....")}()fmt.Println("main....over.....")// 讀取的操作是注阻塞的data := <-afmt.Println(data)fmt.Println("channel demo") }通道關閉
package mainimport ("fmt""time" )func main() {/*關閉通道:close(ch)子goroutine;寫10個數據每寫一個,阻塞一次,主goroutine讀取一次 解除阻塞主goroutine 讀取數據每次讀取數據,阻塞一次, 子goroutine每次寫入一個就解除主阻塞*/cha1 := make(chan int)go sendData1(cha1)//讀取數據.使用for循環需要自己判斷是否通道關閉/* for {v, ok := <-cha1if !ok {fmt.Println("已經讀取了所有的數據......", ok)break}fmt.Println("讀取的數據....", v)}*/// 使用for range就可以讓range自己判斷通道啥時候關閉// cha1關閉的時候,這里range將停止遍歷for v := range cha1 {fmt.Println("main ..over....", v)}//單向 只能寫數據,不能讀數據//ch1 := make(chan <- int)// 單向只能讀不能寫數//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) }使用通道進行數據發送的小例子
// 1. 創建goroutine1, 向 ch1中發送1,100個數
// 2. 創建goroutine2, 向 ch2中發送, 1,-1000的平方
// 3. main函數中從ch2將值取出
go語言中,對已經關閉的通道進行取值,能夠取到,只不過取到的ok為false
package mainimport "fmt"// 對已經關閉的通道進行取值,能夠取到不過ok返回的falsefunc main() {ch1 := make(chan bool, 2)ch1 <- truech1 <- true// 關閉通道close(ch1)<- ch1<- ch1x, ok := <- ch1fmt.Println(x, ok)x, ok = <- ch1fmt.Println(x, ok)x, ok = <- ch1fmt.Println(x, ok) }總結
以上是生活随笔為你收集整理的go语言中channel的创建和销毁以及匿名函数的使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: go语言buffio与继承
- 下一篇: 【软件质量】变更管理与可追踪性