У меня есть функция в Go, которая возвращает два значения. Я хочу запустить это как goroutine, но я не могу понять синтаксис для создания канала, который получает два значения. Может ли кто-нибудь указать мне в правильном направлении?
Как создать канал, который получает несколько возвращаемых значений из goroutine
Ответ 1
Определите настраиваемый тип с полями для обоих значений, затем создайте chan
этого типа.
EDIT: Я также добавил пример (справа внизу), который использует несколько каналов, а не настраиваемый. Я не уверен, что более идиоматично.
Например:
type Result struct {
Field1 string
Field2 int
}
затем
ch := make(chan Result)
Пример использования канала пользовательского типа (Игровая площадка):
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)
}
}
Выдает:
ЛОРЕМ, 5
IPSUM, 5
ДОЛОР, 5
SIT, 3
AMET, 4
EDIT: пример использования нескольких каналов вместо настраиваемого типа для создания того же выхода (Игровая площадка):
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)
}
}