猿问

使用 fanIn 函数复用 Go 例程输出

我试图实现一个示例 Go 代码,用于使用来自 go 例程的返回通道,而主函数中没有任何“读取块”。这里,fanIn 函数接受来自其他两个例程的通道并返回作为输入。


此处,预期输出是来自两个内部例程的随机输出。但实际输出总是一个“ann”后跟一个“john”,在任何情况下都不是随机的。


为什么我没有得到随机输出?


去游乐场:http : //play.golang.org/p/46CiihtPwD


实际输出:


  you say: ann,0 

  you say: john,0

  you say: ann,1

  you say: john,1 

   ......

代码:


package main


import (

    "fmt"

    "time"

)


func main() {


    final := fanIn(boring("ann"), boring("john"))


    for i := 0; i < 100; i++ {

        fmt.Println("you say:", <-final)


    }

    time.Sleep(4 * time.Second)

}


func boring(msg string) chan string {

    c1 := make(chan string)

    go func() {

        for i := 0; ; i++ {

            c1 <- fmt.Sprintf("%s,%d", msg, i)

            time.Sleep(time.Second)


        }

    }()

    return c1

}


func fanIn(input1, input2 <-chan string) chan string {

    c := make(chan string)

    go func() {

        for {

            c <- <-input1

        }

    }()

    go func() {

        for {

            c <- <-input2

        }

    }()

    return c

}


梦里花落0921
浏览 183回答 1
1回答
随时随地看视频慕课网APP

相关分类

Go
我要回答