如下代码:
package main
import (
"fmt"
"sync"
)
var wg sync.WaitGroup
func consumer(queue chan int) {
defer wg.Done()
data := <-queue //将箭头右边的值放在左边
fmt.Println(data)
}
func main() {
/*
*channel提供了一种通信机制,定向发消息
*/
//定义一个channel
var msg1 chan int
//初始化这个channel
msg1 = make(chan int)
msg1 = make(chan int, 1)
//所以综合可以得知,在go语言中使用make初始化的有三种,第一种:slice 第二种:map 第三种: channel
//初始化这个channel有两种方法:第一种:make,无缓冲的 第二种方法:有缓冲空间
msg1 <- 1
wg.Add(1)
go consumer(msg1)
wg.Wait()
var num = 10
var msg chan int
var a *int = &num
if msg == nil {
fmt.Println("hello")
}
fmt.Println(*a)
}
二:如何关闭channel,我们想channel中存数据的时候,可能只想存两个。但是如果我们在consumer中不去关闭的话,就会造成死锁。如下代码,以及解决方法
package main
import (
"fmt"
"sync"
)
var wg sync.WaitGroup
func consumer(queue chan int) {
defer wg.Done()
for data := range queue {
fmt.Println(data)
}
//data := <-queue //将箭头右边的值放在左边
}
func main() {
/*
*channel提供了一种通信机制,定向发消息
*/
//定义一个channel
var msg1 chan int
//初始化这个channel
msg1 = make(chan int)
msg1 = make(chan int, 1)
//所以综合可以得知,在go语言中使用make初始化的有三种,第一种:slice 第二种:map 第三种: channel
//初始化这个channel有两种方法:第一种:make,无缓冲的 第二种方法:有缓冲空间
msg1 <- 1
wg.Add(1)
go consumer(msg1)
msg1 <- 2
//关闭channel
close(msg1) //1.已经关闭的channel不能再发数据了 2.已经关闭的channel消费者还能再读取数据吗,以及关闭的channel还嫩继续取数据,直到数据取完为止
wg.Wait()
var num = 10
var msg chan int
var a *int = &num
if msg == nil {
fmt.Println("hello")
}
fmt.Println(*a)
}