版权声明:版权归作者所有 https://blog.csdn.net/qq_36772866/article/details/82936762
package main
import "fmt"
import "math/rand"
import "time"
// producer
func producer(header string, channel chan<- string){
for{
channel <- fmt.Sprintf("%s: %v", header, rand.Int31())
time.Sleep(time.Second)
}
}
// customer
func customer(channel <- chan string){
for{
message:= <-channel
fmt.Println(message)
}
}
func main() {
fmt.Printf("%s\n", "hello world")
channel := make(chan string)
go producer("cat", channel)
go producer("dog", channel)
customer(channel)
}
代码说明
第3行 导入格式化函数(fmt),随机数(math/rand),时间(time)包参与编译
第10行 生产函数,闯入一个标记类型的字符串以及一个只能写入的通道
第13行 for{}构成一个无限循环
第15行 使用rand.Int31()生成一个随机数,使用fmt.Sprintf()函数格式化
第18行 使用time.Sleep()函数执行暂停1s再执行这个函数,如果goroutine中执行时,暂停不会影响其他goroutine
第23行 消费者函数,传入一个只能写入的通道
第26行 构成一个无限循环
第28行 从通道中取出数据
第31行 将取出来的数据进行打印
第35行 程序入口函数
第37行 实例化一个字符串类型的通道
第39行和第40行 并发执行一个生产者函数,两行分别创建了这个函数搭配不同参数的两个goroutine
第42行 执行消费者函数通过通道进行数据消费
运行结果如下
如何理解通道 channel
其实有点像那个水龙头的水和水管差不多
生产者就是一头的水
通道就是一根水管负责把水传输到另一边
消费者就是相当我们平时用水一样需要用桶子把水装起来一样