GO-运行go例程时从通道读取

问题描述 投票:0回答:1

[希望释放数量不定的goroutine。在此示例中,添加到number通道。然后在滚动时从messages通道中读取消息。

为什么我希望在此代码中看到全部100条消息,为什么只看到一条消息?如何查看所有已添加号码的消息?

Go Playground

package main

import (
    "fmt"
)

func Run(numbers chan int, messages chan string) {
    stuff := <-numbers
    messages <- fmt.Sprintf("Ran %d", stuff)
}

func main() {
    var numbers = make(chan int)
    var messages = make(chan string)

    go Run(numbers, messages)

    for i := 0; i < 100; i++ {
        go func(i int) { numbers <-i }(i) 
    }

    msg := <-messages
    fmt.Println(msg)
}

将消息置于范围内会导致死锁。

Example

package main

import (
    "fmt"
)

func Run(numbers chan int, messages chan string) {
    stuff := <-numbers
    messages <- fmt.Sprintf("Ran %d", stuff)
}

func main() {
    var numbers = make(chan int)
    var messages = make(chan string)

    go Run(numbers, messages)

    for i := 0; i < 100; i++ {
        go func(i int) { numbers <-i }(i) 
    }

    for msg := range messages {
        fmt.Println(msg)
    }
}
go
1个回答
0
投票

因为Runnumbers读取一条消息,将一条消息写入messages,然后终止。请尝试以下方法:


func Run(numbers chan int, messages chan string) {
    for stuff := range numbers {
       messages <- fmt.Sprintf("Ran %d", stuff)
    }
}

将一直运行到numbers关闭。

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.