```go

时间:2025-03-02 00:26 分类:Golang

package main

import ( "fmt" "reflect" "time" )

// 定义一个 int 管道 var intChan chan int

// 定义一个 string 管道 var stringChan chan string

func writeData() { defer wg.Done() for i := 1; i <= 50; i++ { intChan <- i fmt.Println("写入的数据为:", i) time.Sleep(time.Second) } close(intChan) }

func readData() { defer wg.Done() for v := range intChan { fmt.Println("读取的数据为:", v) time.Sleep(time.Second) } }

func main() { // 初始化管道 intChan = make(chan int, 50)

// 启动两个协程
wg.Add(2)
go writeData()
go readData()

// 等待两个协程完成
wg.Wait()

}


这个代码示例展示了如何使用 Go 语言中的管道(channel)来实现协程之间的数据传递。在这个例子中,我们创建了一个用于传递整数的管道 `intChan`,并且定义了两个协程:`writeData()` 和 `readData()`。`writeData()` 协程负责向管道中写入数据,而 `readData()` 协程则负责从管道中读取数据。

在 `main()` 函数中,我们首先初始化了管道 `intChan`,然后启动了两个协程。通过 `wg.Wait()` 语句,我们等待两个协程完成其工作。

需要注意的是,当管道中的数据被读取完毕后,我们需要关闭管道,以避免死锁的发生。在这个例子中,我们在 `writeData()` 函数中使用 `close(intChan)` 语句来关闭管道。

此外,为了避免数据竞争的问题,我们在读写管道时使用了互斥锁(mutex)。在这个例子中,我们使用了 `sync.Mutex` 类型的变量 `mu` 来保护共享资源。

最后,我们还使用了 `time.Sleep()` 函数来控制协程的执行速度,以便观察管道的工作情况。在实际的生产环境中,我们通常不会使用 `time.Sleep()` 函数来控制协程的执行速度,因为这会导致不必要的延迟和资源的浪费。

声明:

1、本博客不从事任何主机及服务器租赁业务,不参与任何交易,也绝非中介。博客内容仅记录博主个人感兴趣的服务器测评结果及一些服务器相关的优惠活动,信息均摘自网络或来自服务商主动提供;所以对本博客提及的内容不作直接、间接、法定、约定的保证,博客内容也不具备任何参考价值及引导作用,访问者需自行甄别。

2、访问本博客请务必遵守有关互联网的相关法律、规定与规则;不能利用本博客所提及的内容从事任何违法、违规操作;否则造成的一切后果由访问者自行承担。

3、未成年人及不能独立承担法律责任的个人及群体请勿访问本博客。

4、一旦您访问本博客,即表示您已经知晓并接受了以上声明通告。

本站资源仅供个人学习交流,请于下载后24小时内删除,不允许用于商业用途,否则法律问题自行承担。

评论 0人参与,0条评论
查看更多

Copyright 2005-2024 yuanmayuan.com 源码园 版权所有 备案信息

声明: 本站非腾讯QQ官方网站 所有软件和文章来自互联网 如有异议 请与本站联系 本站为非赢利性网站 不接受任何赞助和广告