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

我在Go中有一个返回两个值的函数。我想将其作为goroutine运行,但是我无法弄清楚创建接收两个值的通道的语法。有人能指出我正确的方向吗?

回答:

使用两个值的字段定义自定义类型,然后创建chan该类型的。

编辑:我还添加了一个使用多个通道而不是自定义类型的示例(在底部)。我不确定哪个更惯用。

例如:

type Result struct {

Field1 string

Field2 int

}

然后

ch := make(chan Result)

使用自定义类型的频道(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)

}

}

产生:

LOREM,5

IPSUM,5

颜色,5

SIT,3

AMET,4

编辑:使用多个通道而不是自定义类型来产生相同输出(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)

}

}

以上是 如何使通道从goroutine接收多个返回值 的全部内容, 来源链接: utcz.com/qa/401095.html

回到顶部