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

作者 : admin 本文共1996个字,预计阅读时间需要5分钟 发布时间: 2024-06-6 共2人阅读

函数定义

// 普通函数
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)

本站无任何商业行为
个人在线分享 » golang协程(go)与信道(chan)使用示例
E-->