golang 的goroutine(协程)和channel(管道)的使用

package main

import(

    "fmt"

    // "time"

    // "strconv"

    //"runtime"

)

func writeDog(dogChan chan string){

    dog := "dog"

    for i:=1;i<=3;i++{

        dogChan<- dog

    }

    close(dogChan)

}

func writeCat(catChan chan string){

    cat := "cat"

    for i:=1;i<=3;i++{

        catChan<- cat

    }

    close(catChan)

}

func writeFish(fishChan chan string){

    fish := "fish"

    for i:=1;i<=3;i++{

        fishChan<- fish

    }

    close(fishChan)

}





 

func main(){

    //三个管道

    dogChan := make(chan string ,3)

    catChan := make(chan string ,3)

    fishChan := make(chan string ,3)

    //三个执行方法

    go writeDog(dogChan)

    go writeCat(catChan)

    go writeFish(fishChan)

    //打印值

    for{

        dog, ok := <-dogChan

        if !ok{

            break

        }

        fmt.Println("打印=》",dog)

    }

    //打印值

    for{

        cat, ok := <-catChan

        if !ok{

            break

        }

        fmt.Println("打印=》",cat)

    }

    //打印值

    for{

        fish, ok := <-fishChan

        if !ok{

            break

        }

        fmt.Println("打印=》",fish)

    }

    fmt.Println("主线程完毕")

}

最终按照要求输出结果 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
协程是轻量级的线程,可以在同一个程序中并发地执行多个任务。通过使用协程,我们可以更有效地利用计算资源并实现并发编程。而管道是用于在协程之间传递数据的通信机制。在Go语言中,我们可以使用管道来实现协程之间的同步和通信。 在Go语言中,我们可以通过以下步骤来使用协程管道: 1. 使用关键字"go"来创建一个协程,让其并发执行一个函数或方法。 2. 使用"make"函数来创建一个管道,并指定其元素类型和容量。管道可以是有缓冲的(指定了容量)或者无缓冲的(未指定容量)。 3. 在协程中,使用"<-"操作符将数据发送到管道中,或者从管道中接收数据。 4. 如果管道是无缓冲的,发送操作和接收操作会导致发送方和接收方都会阻塞,直到对应的操作完成。这种情况下,协程之间的通信是同步的。 5. 如果管道是有缓冲的,发送操作只有在管道已满时才会阻塞,接收操作只有在管道为空时才会阻塞。这种情况下,协程之间的通信是异步的。 下面是一个示例代码来演示协程管道使用: ```go package main import ( "fmt" ) func worker(id int, jobs <-chan int, results chan<- int) { for j := range jobs { fmt.Println("worker", id, "processing job", j) results <- j * 2 } } func main() { jobs := make(chan int, 5) results := make(chan int, 5) // 创建3个协程来并发执行任务 for w := 1; w <= 3; w++ { go worker(w, jobs, results) } // 发送5个任务到管道中 for j := 1; j <= 5; j++ { jobs <- j } close(jobs) // 从结果管道中接收并打印结果 for r := 1; r <= 5; r++ { fmt.Println(<-results) } } ``` 在这个示例中,我们创建了一个有缓冲的"jobs"管道和一个有缓冲的"results"管道。然后,我们创建了3个协程来并发执行任务。每个协程从"jobs"管道中接收任务,处理任务后将结果发送到"results"管道中。最后,主函数从"results"管道中接收并打印结果。 希望这个示例能够帮助你理解如何在Go语言中使用协程管道

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值