golang协程(go)与信道(chan)使用示例
函数定义
// 普通函数
func f(from string) {
//输出三次传入的字符串
for i := 0; i < 50; i++ {
fmt.Println(from, ":", i)
}
}
协程调用
//使用go协程调用函数
go f("go routines ==> Hello World")
局部函数go协程使用
//使用协和调用临时函数
go func(str string) {
for i := range 10 {
fmt.Println(i, str)
}
}("调用中...") //传参给临时函数
time.Sleep(time.Second) //不休眠,看不到协和输出
fmt.Println("完成")
无缓冲区信道使用
//信道
fmt.Println("===创建无缓冲区信道msg===")
msg := make(chan string) //双向信道
fmt.Println("msg:当前通道已使用大小:", len(msg), "通道容量", cap(msg))
//向信道发送数据
//msg <- "发送到信道中的消息" //不使用协和向信道写入消息会报deadlock
go func() { msg <- "==发送到信道中的消息==" }() //使用协程向信道中写消息
fmt.Println("向信道中发送消息:==发送到信道中的消息==")
fmt.Println("msg:当前通道已使用大小:", len(msg), "通道容量", cap(msg))
//读取信道中的消息
recvMsg := ", recvMsg)
fmt.Println("msg:当前通道已使用大小:", len(msg), "通道容量", cap(msg))
fmt.Println("成功从信道读取信息:===》 ", recvMsg)
有缓冲区信道使用
//指定信道缓冲区大小
fmt.Println("===创建缓冲区大小为2的信道msg2===")
msg2 := make(chan string, 2) //信道容量为2
fmt.Println("msg2:当前通道已使用大小:", len(msg2), "通道容量", cap(msg2))
//向信道写数据
msg2 <- "write message by channel one"
fmt.Println("向通道中写入数据:write message by channel one")
fmt.Println("msg2:当前通道已使用大小:", len(msg2), "通道容量", cap(msg2))
msg2 <- "write message by channel two"
fmt.Println("向通道中写入数据:write message by channel two")
fmt.Println("msg2:当前通道已使用大小:", len(msg2), "通道容量", cap(msg2))
//读取信道数据
fmt.Println("读取信道数据:", <-msg2)
fmt.Println("msg2:当前通道已使用大小:", len(msg2), "通道容量", cap(msg2))
fmt.Println("读取信道数据:", <-msg2)
fmt.Println("msg2:当前通道已使用大小:", len(msg2), "通道容量", cap(msg2))
信道同步
// 信道作为参数使用
func workWithChannel(done chan bool) {
fmt.Println("信道开始工作...")
for i := 0; i >>信道内容处理输出:", i)
}
time.Sleep(1 * time.Second)
fmt.Println("信道工作结束")
done <- true //向信道写消息
}
//信道同步
done := make(chan bool, 1) //初始化信道参数
workWithChannel(done) //调用函数并传入信道
信道之间相互通信
// 信道直通
// pings : 信道
// msg : 消息
func ping(pings chan<- string, msg string) {
pings <- msg //向信道写入消息
}
// pings信道与pongs信道直接通信
// pings: pings信道
// pongs: pongs信道
func pong(pings <-chan string, pongs chan<- string) {
msg := <-pings //读取pings信道的消息存储到msg
pongs <- msg //向pongs信道写入msg
}
//信道直通测试
pings := make(chan string, 1) //创建信道
pongs := make(chan string, 1) //创建信道
//调用信道通信方法
ping(pings, "Hello from pings ")
pong(pings, pongs) //双信道进行通信
msgfrompongs := <-pongs //读取pongs信道消息
fmt.Println("pongs信道消息:", msgfrompongs)