go没有buffer的channel的调用顺序

go没有buffer的channel的调用顺序,第1张

概述 第一种情况第二种情况第三种情况第四种情况rbrbsbsbsbsbrbrbserereseresesere显然:sendbegin早于sendend, recvbegin早于recvend,------------------------------------------------可得:非buffer的channel时:sendb

 

第一种情况第二种情况第三种情况第四种情况
rbrbsbsb
sbsbrbrb
sererese
resesere

显然: send begin 早于 send end, 

   recv begin 早于 recv end,

------------------------------------------------

  可得: 非buffer 的channel时: send begin 早于 recv end ---------这条也好理解。(没有buffer, 【接收完成】 肯定要晚于 【发送开始】)

                recv begin 早于 send end ----------这条稍微难理解一点,比较重要。(因为有buffer时, 【recv begin】 可能晚于 【send end】)

 

 

 

 

https://segmentfault.com/a/1190000008230146

https://www.jianshu.com/p/5e44168f47a3

 

------------------------------------------------------------------------------------------

第一种: r, s, s, r

 

 

package mainimport (//  "log"  "time")var a stringvar c = make(chan int)func main() {  go func() {     a = "hello\n"    print("recv begin..\n")    <-c    sum :=0    for i := 0; i<1<<24; i++ {      sum += i    }    print("recv end..\n")  }()  sum :=0  for i := 0; i<1<<24; i++ {    sum += i  }  print("send begin..\n")  c <-12  print("send end..\n")  print(a)  time.Sleep(time.Second*2)}

----------------------------------------

  第二种情况 r, s, r, s

 

 

 package main  import ( //  "log"   "time" )  var a string var c = make(chan int) func main() {   go func() {      a = "hello\n"     print("recv begin..\n")     <-c          print("recv end..\n")   }()   sum :=0   for i := 0; i<1<<24; i++ {     sum += i   }   print("send begin..\n")   c <-12   sum =0   for i := 0; i<1<<24; i++ {     sum += i   }   print("send end..\n")   print(a)   time.Sleep(time.Second*2) }

---------------------------------------

  第三种情况:s, r, r, s

 

 

package mainimport (//  "log"  "time")var a stringvar c = make(chan int)func main() {  go func() {     a = "hello\n"    print("recv begin..\n")    <-c        print("recv end..\n")  }()  print("send begin..\n")  c <-12  sum :=0  for i := 0; i<1<<24; i++ {    sum += i  }   print("send end..\n")  print(a)   time.Sleep(time.Second*2)}   

-----------------------------------------  

第四种情况: s, r, s, r

 

 

package mainimport (//  "log"  "time")var a stringvar c = make(chan int)func main() {  go func() {     a = "hello\n"    print("recv begin..\n")    <-c    sum :=0    for i := 0; i<1<<24; i++ {      sum += i    }    print("recv end..\n")  }()  print("send begin..\n")  c <-12    print("send end..\n")  print(a)  time.Sleep(time.Second*2)}

  

总结

以上是内存溢出为你收集整理的go没有buffer的channel的调用顺序全部内容,希望文章能够帮你解决go没有buffer的channel的调用顺序所遇到的程序开发问题。

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

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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存