Go语言_Go语言的channel

时间:2021-03-10 05:10:21

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 ")
}

测试截图

Go语言_Go语言的channel