Подтвердить что ты не робот

Как создать канал, который получает несколько возвращаемых значений из goroutine

У меня есть функция в Go, которая возвращает два значения. Я хочу запустить это как goroutine, но я не могу понять синтаксис для создания канала, который получает два значения. Может ли кто-нибудь указать мне в правильном направлении?

4b9b3361

Ответ 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)
    }
}