通道(channel)传递数据的例子写一个

当然!以下是一个简单的 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 之间通过通道传递的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值