Golang中的channel代码示例----无缓冲、有缓冲、range、close

Golang中的channel代码示例----无缓冲、有缓冲、range、close,第1张

概述// code_043_channel_unbuffered project main.go package main import ( "fmt" "time" ) func main() { c := make(chan int, 0) //无缓冲的通道 //内置函数 len 返回未被读取的缓冲元素数量, cap 返回缓冲区大小 fmt.Printf("len(c)=%d, cap(c)=%d @H_419_2@ // code_043_channel_unbuffered project main.go package main import ( "fmt" "time" ) func main() { c := make(chan int,0) //无缓冲的通道 //内置函数 len 返回未被读取的缓冲元素数量, cap 返回缓冲区大小 fmt.Printf("len(c)=%d,cap(c)=%d\n",len(c),cap(c)) go func() { defer fmt.Println("子协程结束") for i := 0; i < 3; i++ { fmt.Printf("子协程正在运行[%d]: len(c)=%d,i,cap(c)) c <- i //备注:如果在上面的话,不会执行最后一次Printf } }() time.Sleep(2 * time.Second) //延时2s for i := 0; i < 3; i++ { num := <-c //从c中接收数据,并赋值给num fmt.Println("num = ",num) } fmt.Println("main协程结束") }
// code_044_channel_buffered project main.gopackage mainimport (    "fmt"    "time")//有缓冲的通道(buffered channel)是一种在被接收前能存储一个或者多个值的通道。//只有在通道中没有要接收的值时,接收动作才会阻塞。只有在通道没有可用缓冲区容纳被发送的值时,发送动作才会阻塞。//有缓冲的通道和无缓冲的通道之间的不同://1)无缓冲的通道保证进行发送和接收的 goroutine 会在同一时间进行数据交换;//2)有缓冲的通道没有这种保证func main() {    c := make(chan int,3)    fmt.Printf("len(c)=%d,cap(c))    go func() {        defer fmt.Println("子协程结束")        for i := 0; i < 3; i++ {            c <- i            fmt.Printf("子协程正在运行[%d]: len(c)=%d,cap(c))        }    }()    time.Sleep(2 * time.Second)    for i := 0; i < 3; i++ {        num := <-c        fmt.Println("num=",num)    }    fmt.Println("main协程结束")}
// code_045_channel_range_close project main.gopackage mainimport (    "fmt")//注意点://?channel不像文件一样需要经常去关闭,只有当你确实没有任何发送数据了,或者你想显式的结束range循环之类的,才去关闭channel;//?关闭channel后,无法向channel 再发送数据(引发 panic 错误后导致接收立即返回零值);//?关闭channel后,可以继续向channel接收数据;//  对于nil channel,无论收发都会被阻塞。/* close()的使用func main() {    c := make(chan int)    go func() {        for i := 0; i < 5; i++ {            c <- i        }        //把 close(c) 注释掉,程序会一直阻塞在 if data,ok := <-c; ok 那一行        //注释后报错“死锁”:Fatal error: all goroutines are asleep - deadlock!        close(c)    }()    for {        //ok为true说明channel没有关闭,为false说明管道已经关闭        if data,ok := <-c; ok {            fmt.Println(data)        } else {            break        }    }    fmt.Println("Finished")}*/func main() {    c := make(chan int)    go func() {        for i := 0; i < 5; i++ {            c <- i        }        close(c)    }()    for data := range c {        fmt.Println(data)    }    fmt.Println("Finished")}
@H_419_2@ 总结

以上是内存溢出为你收集整理的Golang中的channel代码示例----无缓冲、有缓冲、range、close全部内容,希望文章能够帮你解决Golang中的channel代码示例----无缓冲、有缓冲、range、close所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1269785.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-08
下一篇 2022-06-08

发表评论

登录后才能评论

评论列表(0条)

保存