channel是Go语言在语言级别提供的goroutine间的通信方式。我们可以使用channel在两个或多个goroutine之间传递消息。
channel是进程内的通信方式,因此通过channel传递对象的过程和调用函数时的参数传递行为比较一致,比如也可以传递指针等。如果需要跨进程通信,我们建议用分布式系统的方法来解决,比如使用Socket或者HTTP等通信协议。Go语言对于网络方面也有非常完善的支持。
写入数据
通过ch <- 1语句向对应的channel中写入一个数据。在这个channel被读取前,这个操作是阻塞的
语法示例:
ch <- value
读取数据
向channel写入数据通常会导致程序阻塞,直到有其他goroutine从这个channel中读取数据
语法示例:
value := <-ch
完整的示例代码:
// Go_once project main.go
package main
import (
"fmt"
"sync"
)
var a string
var once sync.Once
var lock chan int = make(chan int)
var ct int = 1
func setup() {
if ct == 1 {
a = "Hello, world"
ct--
} else {
a = "GKM"
}
}
func doprint() {
once.Do(setup)
fmt.Println(a)
lock <- 1
}
func twoprint() {
go doprint()
go doprint()
}
func main() {
twoprint()
<-lock
fmt.Println("out of lock, lock value is ")
}
测试截图