首页 > 解决方案 > 无法从渠道获取价值

问题描述

我在通道中插入了一些值。之后我试图从通道中取出它,但它没有得到任何值并退出。有谁知道为什么?

package main
import (
    "fmt"
)
func main() {
    c := make( chan string)
    for _, s := range []string{"A", "B", "C"} {
        fmt.Println( "input : ", s)
        go func() {
            c <- s 
        }()
    }
    close( c)
    // recive
    for i := range c {
        fmt.Println("output", i)
    }
}

期望输出

input :  A
input :  B
input :  C
output : A
output : B
output : C

电流输出

input :  A
input :  B
input :  C

标签: go

解决方案


在您在通道中添加值之前,您的通道可能已关闭(close在 goroutine 的第一行之前调用)。那么当然不会在频道中读取任何内容。您可以像这样切换到缓冲通道,而不是使用 goroutine 在通道中添加值:

package main
import (
    "fmt"
)
func main() {
    inputs := []string{"A", "B", "C"}
    c := make(chan string, len(inputs))
    for _, s := range inputs {
        fmt.Println( "input : ", s)
        c <- s 
    }
    close(c)
    // recive
    for i := range c {
        fmt.Println("output", i)
    }
}

或者,您可以像这样使用 WaitGroup:

package main
import (
    "fmt"
    "sync"
)
func main() {
    var wg sync.WaitGroup
    inputs := []string{"A", "B", "C"}
    c := make(chan string)
    for _, s := range inputs {
        fmt.Println( "input : ", s)
        wg.Add(1)
        go func(s string) {
            c <- s
            wg.Done()
        }(s)
    }
    go func(){
        wg.Wait()
        close(c)
    }()

    // recive
    for i := range c {
        fmt.Println("output", i)
    }
}

推荐阅读