1.channel是什么
在Go语言中,Channel是一种用于在Goroutine之间进行通信的数据结构。它类似于队列,可以在一个Goroutine中将数据发送到Channel,然后在另一个Goroutine中接收这些数据。Channel提供了一种同步的方式,确保发送和接收操作按顺序进行,从而避免了并发访问共享数据的问题。
2.创建channel管道,并初始化
var 变量 chan 元素类型
变量 = make(chan 元素类型,缓冲区大小)
例如:
初始化一个可以接收、发送int值类型的通道,缓冲区为0
c**加粗样式**h := make(chan int)
初始化一个可以接收、发送int值类型的通道,可缓冲1个int值。第2个int值向通道中发送时会被阻塞。被缓冲的元素值,会严格按发送的顺序接收。
ch := make(chan int,1)
注意定义channel管道类型的方向
chan 类型 双向
chan<- 类型 只发送
<-chan 类型 只接收
3.channel操作
通道有发送(send)、接收(receive)和关闭(close)三种操作。
发送
将一个值发送到通道中。
ch <- 数据
接收
从一个通道中接收值。
<- channel //从channel中接收数据并将其丢弃
x := <- channel //从channel中接收数据,将其赋值给x
x, ok := channel //从channel中接收数据,将其赋值给x,同时检查通道是否已关闭或者是否为空
关闭
close(ch)
4.channel使用
双向通道ch chan int
func main() {ch := make(chan int)go One(ch)result := <-chfmt.Println(result)
}
//双向通道 可以接收也可以发送
func One(ch chan int) {ch <- 42
}
单向通道,只能发送ch chan<- int
func main() {ch := make(chan int)go One(ch)result := <-chfmt.Println(result)
}
//单向通道,只能发送
func One(ch chan<- int) {ch <- 42}
单向通道,只能接收ch <-chan int
func main() {ch := make(chan int)go One(ch)ch <- 42
}
//单向通道,只能接收
func One(ch <-chan int) {result := <-chfmt.Println(result)}
5.go gin框架接口使用channel异步执行
//下方响应不会等one函数执行完毕
func test(context *gin.Context) {msg, _ := ioutil.ReadAll(context.Request.Body)log.Println(string(msg))var info map[string]interface{}json.Unmarshal(msg, &info)ch := make(chan map[string]interface{},1)go One(ch)ch <- infoclose(ch)context.String(200,"返回")}func One(ch <-chan map[string]interface{}) {time.Sleep(5 * time.Second)info := <-chlog.Println("11接受到info",info)}//该接口等one函数执行完毕后在返回响应
func test1(context *gin.Context) {msg, _ := ioutil.ReadAll(context.Request.Body)log.Println(string(msg))var info map[string]interface{}json.Unmarshal(msg, &info)ch := make(chan map[string]interface{})go One1(ch)ch <- infoclose(ch)context.String(200,"返回")}func One1(ch <-chan map[string]interface{}) {time.Sleep(5 * time.Second)info := <-chlog.Println("11接受到info",info)}