В вашем коде есть несколько вещей, на которые стоит обратить внимание.
Первый - это использование переменной s
из цикла for в замыкании.
go func() {
c <- s
}()
Здесь вы можете получить несогласованные значения, поскольку вы не знаете, когда будут выполняться эти программы. Из всего, что вы знаете, вы могли бы написать «С» на канал три раза. Если вы хотите использовать его с отдельными процедурами, используйте его следующим образом:
go func(str string) {
c <- str
}(s)
Что касается значений, не извлекаемых из канала, канал закрывается, прежде чем из него можно извлечь что-либо. Вы можете написать что-то вроде этого:
package main
import (
"fmt"
)
func main() {
c := make( chan string)
go func(){
for _, s := range []string{"A", "B", "C"} {
fmt.Println( "input : ", s)
c <- s
}
close( c)
}()
// recive
for i := range c {
fmt.Println("output", i)
}
}
Но даже это даст вам вывод, подобный этому (и даже это может варьироваться):
input : A
input : B
output A
output B
input : C
output C
Чтобы получить вывод, который вы хотели, вывероятно, потребуется использовать буферизованный канал и какой-то механизм для предотвращения чтения, пока все не будет записано в канал. Может быть, что-то вроде этого:
package main
import (
"fmt"
"sync"
)
func main() {
c := make( chan string,3)
var wg sync.WaitGroup
wg.Add(3)
for _, s := range []string{"A", "B", "C"} {
fmt.Println( "input : ", s)
c <- s
}
go func(w *sync.WaitGroup){
// recive
for i := range c {
fmt.Println("output", i)
w.Done()
}
}(&wg)
wg.Wait()
close(c)
}