Golang中的channel代码示例----无缓冲、有缓冲、range、close
发布时间:2020-12-16 09:33:20 所属栏目:大数据 来源:网络整理
导读:// 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)=%dn",len(c)
// 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)=%dn",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.go package main import ( "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.go package main import ( "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") } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |