doujiao1905 2013-07-24 05:27 采纳率: 100%
浏览 621
已采纳

如何使通道从goroutine接收多个返回值

I have a function in Go that returns two values. I want to run this as a goroutine, but I can't figure out the syntax for creating a channel that receives two values. Could someone point me in the right direction?

  • 写回答

2条回答 默认 最新

  • doubu1950 2013-07-24 05:35
    关注

    Define a custom type with fields for both values, then create a chan of that type.

    EDIT: I've also added an example (right at the bottom) that uses multiple channels rather than a custom type. I'm not sure which is more idiomatic.

    For example:

    type Result struct {
        Field1 string
        Field2 int
    }
    

    then

    ch := make(chan Result)
    

    Example of using a channel of a custom type (Playground):

    package main
    
    import (
        "fmt"
        "strings"
    )
    
    type Result struct {
        allCaps string
        length  int
    }
    
    func capsAndLen(words []string, c chan Result) {
        defer close(c)
        for _, word := range words {
            res := new(Result)
            res.allCaps = strings.ToUpper(word)
            res.length = len(word)
            c <- *res       
        }
    }
    
    func main() {
        words := []string{"lorem", "ipsum", "dolor", "sit", "amet"}
        c := make(chan Result)
        go capsAndLen(words, c)
        for res := range c {
            fmt.Println(res.allCaps, ",", res.length)
        }
    }
    

    Produces:

    LOREM , 5
    IPSUM , 5
    DOLOR , 5
    SIT , 3
    AMET , 4

    EDIT: Example using multiple channels instead of a custom type to produce the same output (Playground):

    package main
    
    import (
        "fmt"
        "strings"
    )
    
    func capsAndLen(words []string, cs chan string, ci chan int) {
        defer close(cs)
        defer close(ci)
        for _, word := range words {
            cs <- strings.ToUpper(word)
            ci <- len(word)
        }
    }
    
    func main() {
        words := []string{"lorem", "ipsum", "dolor", "sit", "amet"}
        cs := make(chan string)
        ci := make(chan int)
        go capsAndLen(words, cs, ci)
        for allCaps := range cs {
            length := <-ci
            fmt.Println(allCaps, ",", length)
        }
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 R语言Rstudio突然无法启动
  • ¥15 关于#matlab#的问题:提取2个图像的变量作为另外一个图像像元的移动量,计算新的位置创建新的图像并提取第二个图像的变量到新的图像
  • ¥15 改算法,照着压缩包里边,参考其他代码封装的格式 写到main函数里
  • ¥15 用windows做服务的同志有吗
  • ¥60 求一个简单的网页(标签-安全|关键词-上传)
  • ¥35 lstm时间序列共享单车预测,loss值优化,参数优化算法
  • ¥15 Python中的request,如何使用ssr节点,通过代理requests网页。本人在泰国,需要用大陆ip才能玩网页游戏,合法合规。
  • ¥100 为什么这个恒流源电路不能恒流?
  • ¥15 有偿求跨组件数据流路径图
  • ¥15 写一个方法checkPerson,入参实体类Person,出参布尔值