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