当然!以下是一个简单的 Go 程序示例,展示了如何使用通道(channel)在两个 goroutine 之间传递数据。 示例代码 go package main import ( "fmt" "time" ) // 发送数据到通道的 goroutine func sendData(ch chan int) { for i := 1; i <= 5; i++ { ch <- i // 发送数据到通道 fmt.Printf("Sent: %d\n", i) time.Sleep(time.Second) // 模拟工作负载 } close(ch) // 关闭通道,通知接收者不再发送数据 } // 从通道接收数据的 goroutine func receiveData(ch chan int) { for data := range ch { // 读取数据直到通道关闭 fmt.Printf("Received: %d\n", data) } fmt.Println("Channel closed, no more data.") } func main() { // 创建一个整型通道 ch := make(chan int) // 启动发送数据的 goroutine go sendData(ch) // 启动接收数据的 goroutine go receiveData(ch) // 等待 goroutine 完成 time.Sleep(6 * time.Second) } 解释 创建通道: go ch := make(chan int) 这行代码创建了一个可以传递整数的通道。 发送数据的 goroutine: go func sendData(ch chan int) { for i := 1; i <= 5; i++ { ch <- i // 发送数据到通道 fmt.Printf("Sent: %d\n", i) time.Sleep(time.Second) // 模拟工作负载 } close(ch) // 关闭通道,通知接收者不再发送数据 } 这个函数在循环中向通道发送整数数据。它在每次发送后等待一秒钟。最后,它关闭通道以通知接收方不再有更多数据。 接收数据的 goroutine: go func receiveData(ch chan int) { for data := range ch { // 读取数据直到通道关闭 fmt.Printf("Received: %d\n", data) } fmt.Println("Channel closed, no more data.") } 这个函数从通道中接收数据。range 关键字在通道关闭后会自动停止迭代。接收方打印接收到的数据,并在通道关闭时输出一条消息。 启动 goroutine 并等待完成: go func main() { ch := make(chan int) go sendData(ch) go receiveData(ch) time.Sleep(6 * time.Second) // 等待 goroutine 完成 } 在 main 函数中,我们创建通道,启动 sendData 和 receiveData 函数作为 goroutine,并在主程序中等待足够的时间以确保 goroutine 执行完毕。 输出 程序将显示发送和接收的整型数据,类似于: Sent: 1 Received: 1 Sent: 2 Received: 2 Sent: 3 Received: 3 Sent: 4 Received: 4 Sent: 5 Received: 5 Channel closed, no more data. 这样,你就可以看到数据是如何在两个 goroutine 之间通过通道传递的。
通道(channel)传递数据的例子写一个
最新推荐文章于 2024-10-17 15:47:06 发布