登录
首页 >  Golang >  Go问答

如何在 goroutine 中返回多个值?

来源:stackoverflow

时间:2024-03-12 22:51:28 486浏览 收藏

哈喽!今天心血来潮给大家带来了《如何在 goroutine 中返回多个值?》,想必大家应该对Golang都不陌生吧,那么阅读本文就都不会很困难,以下内容主要涉及到,若是你正在学习Golang,千万别错过这篇文章~希望能帮助到你!

问题内容

我找到了一些“从 goroutines 捕获值”-> 链接的示例

这里展示了如何获取值,但是如果我想从多个 goroutine 返回值,它就行不通。那么,有人知道如何做到这一点吗?

package main

import (
    "fmt"
    "io/ioutil"
    "log"
    "net/http"
    "sync"
)

// WaitGroup is used to wait for the program to finish goroutines.
var wg sync.WaitGroup

func responseSize(url string, nums chan int) {
    // Schedule the call to WaitGroup's Done to tell goroutine is completed.
    defer wg.Done()

    response, err := http.Get(url)
    if err != nil {
        log.Fatal(err)
    }
    defer response.Body.Close()
    body, err := ioutil.ReadAll(response.Body)
    if err != nil {
        log.Fatal(err)
    }
    // Send value to the unbuffered channel
    nums <- len(body)
}

func main() {
    nums := make(chan int) // Declare a unbuffered channel
    wg.Add(1)
    go responseSize("https://www.golangprograms.com", nums)
    go responseSize("https://gobyexample.com/worker-pools", nums)
    go responseSize("https://stackoverflow.com/questions/ask", nums)
    fmt.Println(<-nums) // Read the value from unbuffered channel
    wg.Wait()
    close(nums) // Closes the channel
    // >> loading forever

此外,这个例子中,工作池

是否可以从结果中获取值:fmt.println(<-results) <- 将出错。


正确答案


是的,只需从频道中多次读取即可:

answerOne := <-nums
answerTwo := <-nums
answerThree := <-nums

通道的功能类似于线程安全队列,允许您将值排队并一一读出

附注您应该将 3 个添加到等待组中,或者根本不添加 3 个。 <-nums 将阻塞,直到 nums 上有可用值为止,因此没有必要

今天带大家了解了的相关知识,希望对你有所帮助;关于Golang的技术知识我们会一点点深入介绍,欢迎大家关注golang学习网公众号,一起学习编程~

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>