您的位置:首页 > 健康 > 美食 > golang协程(go)与信道(chan)使用示例

golang协程(go)与信道(chan)使用示例

2024/12/23 5:02:49 来源:https://blog.csdn.net/fittec/article/details/139495413  浏览:    关键词: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 <- "发送到信道中的消息" //不使用协和向信道写入消息会报deadlockgo func() { msg <- "==发送到信道中的消息==" }() //使用协程向信道中写消息fmt.Println("向信道中发送消息:==发送到信道中的消息==")fmt.Println("msg:当前通道已使用大小:", len(msg), "通道容量", cap(msg))//读取信道中的消息recvMsg := <-msgfmt.Println("读取信道中消息: ==>", recvMsg)fmt.Println("msg:当前通道已使用大小:", len(msg), "通道容量", cap(msg))fmt.Println("成功从信道读取信息:===》 ", recvMsg)

有缓冲区信道使用

//指定信道缓冲区大小fmt.Println("===创建缓冲区大小为2的信道msg2===")msg2 := make(chan string, 2) //信道容量为2fmt.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 < 5; i++ {fmt.Println(">>>信道内容处理输出:", 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信道的消息存储到msgpongs <- 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)

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com