golang channal问题请教

package main

import (
    "fmt"
)

func main() {
    resultChan := make(chan int)
    for i := 1; i <= 10; i++ {
        go func(resultChan chan int) {
            //收集结果,比如接口调用的返回的结构,存入channal中
            resultChan <- 1
        }(resultChan)
    }

    //存放resultChan中的值
    var res []int

    /*
    for {
        select {
        case tmp := <-resultChan:
            res = append(res, tmp)
        }
    }
    */
    
    //问题? 如何将resultChan中的值全部收集到res变量中???

    fmt.Println(res)
}
阅读 3.2k
2 个回答

按我的理解,我写的代码。。

package main

import (
    "fmt"
    "sync"
)

func main() {
    resultChan := make(chan int)
    var wg sync.WaitGroup
    for i := 1; i <= 10; i++ {
        wg.Add(1)
        go func(resultChan chan int) {
            defer wg.Done()
            //收集结果,比如接口调用的返回的结构,存入channal中
            resultChan <- 1
        }(resultChan)
    }

    //存放resultChan中的值
    var res []int

    go func() {
        wg.Wait()
        close(resultChan)
    }()

    for tmp := range resultChan {
        res = append(res, tmp)
    }

    fmt.Println(res)

}

从你的代码来看,你开了 10 个 goroutine 向同一个 channel 写 1,然后立刻进行一次尝试:从 channel 中读 1 次,如果取不到就退出。

我理解你是想开 10 个 goroutine 作为 worker,最后汇总结果到一处。可以这么做:

func main() {
    resultChan := make(chan int, 10)
    for i := 1; i <= 10; i++ {
        go func() {
            //收集结果,比如接口调用的返回的结构,存入channal中
            resultChan <- 1
        }()
    }

    //存放resultChan中的值
    var res []int

    //一直等待取够 10 个
    for len(res) < 10 {
        select {
        case tmp := <-resultChan:
            res = append(res, tmp)
        default:
            //你的代码其实是走到了这里,然后退出了
        }
    }
    fmt.Println(res)
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题