大道如青天,协程来通信,Go lang1.18入门精炼教程,由白丁入鸿儒,Go lang通 ...

打印 上一主题 下一主题

主题 1027|帖子 1027|积分 3081

众所周知,Go lang的作用域相对严格,数据之间的通信往往要依靠参数的传递,但如果想在多个协程任务中间做数据通信,就需要通道(channel)的参与,我们可以把数据封装成一个对象,然后把这个对象的指针传入某个通道变量中,另外一个协程从这个通道中读出变量的指针,并处理其指向的内存对象。
通道的声明与创建
  1.   
  2. package main  
  3.   
  4. import "fmt"  
  5.   
  6. func main() {  
  7.         var a chan int  
  8.         if a == nil {  
  9.                 fmt.Println("通道是空的, 不能使用,需要先创建通道")  
  10.                 a = make(chan int)  
  11.                 fmt.Printf("数据类型是: %T", a)  
  12.         }  
  13. }
复制代码
这里注意,通道声明之后还需要进行创建。
也可以通过海象操作符声明并创建:
  1. package main  
  2.   
  3. import "fmt"  
  4.   
  5. func main() {  
  6.           
  7.         a := make(chan int)  
  8.   
  9.         fmt.Printf("数据类型是: %T", a)  
  10.   
  11. }
复制代码
程序返回:
  1. 数据类型是: chan int%
复制代码
如此,一个类型为整形的通道就创建好了。
此外,通道是引用数据类型:
  1. package main  
  2.   
  3. import (  
  4.         "fmt"  
  5. )  
  6.   
  7. func main() {  
  8.         ch1 := make(chan int)  
  9.         fmt.Printf("%T,%p\n", ch1, ch1)  
  10.   
  11.         test1(ch1)  
  12.   
  13. }  
  14.   
  15. func test1(ch chan int) {  
  16.         fmt.Printf("%T,%p\n", ch, ch)  
  17. }
复制代码
程序返回:
  1. chan int,0x1400010e060  
  2. chan int,0x1400010e060
复制代码
可以看到,在test1函数内和main函数内通道的地址是一样的,所以他们指向的都是同一个通道。
通道的使用

通道创建之后,即可以在协程之间充当桥梁:
  1. package main  
  2.   
  3. import "fmt"  
  4.   
  5. func job(ch1 chan int) {  
  6.   
  7.         ch1 <- 1  
  8.   
  9. }  
  10.   
  11. func main() {  
  12.   
  13.         ch1 := make(chan int)  
  14.   
  15.         fmt.Println(ch1)  
  16.   
  17.         go job(ch1)  
  18.   
  19.         data := <-ch1 // 从ch1通道中读取数据  
  20.         fmt.Println("data-->", data)  
  21.         fmt.Println("main。。over。。。。")  
  22. }
复制代码
藉此,就完成了数据的传递。
这里需要注意通道的调用语法:
[code]data :=
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

用户云卷云舒

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表