【go channel管道】

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 := <-ch
	fmt.Println(result)
}
//双向通道 可以接收也可以发送
func One(ch chan int) {
	ch <- 42
}

单向通道,只能发送ch chan<- int

func main() {
	ch := make(chan int)
	go One(ch)
	result := <-ch
	fmt.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 := <-ch
	fmt.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 <- info
	close(ch)
	context.String(200,"返回")

}


func One(ch <-chan map[string]interface{}) {
	time.Sleep(5 * time.Second)
	info := <-ch
	log.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 <- info
	close(ch)
	context.String(200,"返回")

}


func One1(ch <-chan map[string]interface{}) {
	time.Sleep(5 * time.Second)
	info := <-ch
	log.Println("11接受到info",info)

}

你可能感兴趣的:(go,golang)