2013-07-24 14 views

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) 
    } 
} 
+1

@ nick-craig-wood Dzięki za edycję, pochopne zgłoszenie z mojej strony. – Intermernet

+2

To szkoda; zdaje się, że pokonuje cały punkt zezwalający na wielokrotne zwracanie wartości. –

+4

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

Powiązane problemy