Mam funkcję w Go, która zwraca dwie wartości. Chcę uruchomić to jako goroutine, ale nie mogę znaleźć składni do utworzenia kanału, który odbiera dwie wartości. Czy ktoś może wskazać mi właściwy kierunek?Jak utworzyć kanał, który otrzymuje wiele wartości zwracanych z goroutine
19
A
Odpowiedz
29
Zdefiniuj niestandardowy typ z polami dla obu wartości, a następnie utwórz chan
tego typu.
EDYCJA: Dodałem również przykład (u dołu), który używa wielu kanałów, a nie typu niestandardowego. Nie jestem pewien, który jest bardziej idiomatyczny.
Na przykład:
type Result struct {
Field1 string
Field2 int
}
następnie
ch := make(chan Result)
przykładzie za pomocą kanału niestandardowego typu (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)
}
}
Wytwarza:
lorem, 5
ipsum 5
ból, 5
SIT, 3
AMET, 4
Edycja: przykład przy użyciu wielu kanałów zamiast niestandardowego typu dla uzyskania tego samego wyjścia (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)
}
}
Powiązane problemy
- 1. np. Gdzie wiele wartości zwracanych
- 2. MATLAB - wiele wartości zwracanych z funkcji?
- 3. Jak mogę zamknąć kanał wysyłany przez wiele goroutinów?
- 4. Wiele odbiorników na jednym kanale. Kto otrzymuje dane?
- 5. Uzyskiwanie wartości zwracanych z Task.WhenAll
- 6. Metoda przeciążania zwracanych wartości
- 7. Jak korzystać z basenu goroutine
- 8. C++ Jak wiele dziedziczy z interfejsów z różnych typów zwracanych?
- 9. Jak to wyciek ten kanał?
- 10. Wyłączanie optymalizacji wartości zwracanych g ++
- 11. Problem z parametrami typu Java dla zwracanych wartości
- 12. jak utworzyć pojedynczy adnotację przyjąć wiele wartości w Javie
- 13. Jak mogę przechwycić wiele wartości zwracanych w wywołaniu do arrayfun MATLAB?
- 14. Wiele wartości opcji w Scala
- 15. Goroutine: time.Sleep or time.After
- 16. Wybrać w goroutine ocenia każde inne stwierdzenie
- 17. Czy nadal można utworzyć kanał RSS z grupy na Facebooku?
- 18. Jak zwrócić wiele wartości?
- 19. Golank goroutine nie działa z kanałem wewnątrz
- 20. Brak wyjścia z goroutine w Go
- 21. Jak utworzyć kanał RSS/Atom w Rails 3?
- 22. Czy kanał Go zwraca dwie wartości?
- 23. Scala lift framework, formularz ajax, który przesyła wiele wartości?
- 24. Dlaczego dane sprężyn wciąż używają odwołań zerowych jako wartości zwracanych?
- 25. Jak ograniczyć ilość zwracanych wyników w Sybase?
- 26. dobry styl w przypadku sprawdzania wielu wartości zwracanych
- 27. wybierz kanał <- <- kanał
- 28. jak zwracać wiele wartości z metodą
- 29. Przekazywanie funkcji, które mają wiele wartości zwracanych jako argumenty w języku Python
- 30. FocusEvent nie otrzymuje ostatniej wartości JFormattedTextField, jak mogę ją uzyskać?
@ nick-craig-wood Dzięki za edycję, pochopne zgłoszenie z mojej strony. – Intermernet
To szkoda; zdaje się, że pokonuje cały punkt zezwalający na wielokrotne zwracanie wartości. –
Interesujący punkt. Byłoby fajnie móc zrobić "c: = make (ciąg znaków, err)" lub podobne i mieć odpowiednie struktury danych tworzone "za kulisami". Może warto zamówić funkcję Go? – Intermernet