Я смотрю потрясающее видео о Advanced Go Concurrency Patterns. В начале Sameer Ajmani показывает приложение для пинг-понга.Получить тупик при попытке получить значение дважды
package main
import (
"fmt"
"time"
)
type Ball struct{ hits int }
func main() {
table := make(chan *Ball)
go player("ping", table)
go player("pong", table)
table <- new(Ball) // game on; toss the ball
time.Sleep(1 * time.Second)
fmt.Println(<-table) // game over; grab the ball
}
func player(name string, table chan *Ball) {
for {
ball := <-table
ball.hits++
fmt.Println(name, ball.hits)
time.Sleep(100 * time.Millisecond)
table <- ball
}
}
Код, как он работает, я понимаю до 90 процентов. Это два гортана, которые они посылают друг другу, пинг и понг, во время основного сна.
Тогда я пытаюсь следующий
package main
import (
"fmt"
"time"
)
type Ball struct{ hits int }
func main() {
table := make(chan *Ball)
go player("ping", table)
go player("pong", table)
table <- new(Ball) // game on; toss the ball
time.Sleep(1 * time.Second)
fmt.Println(<-table) // game over; grab the ball
fmt.Println(<-table) // game over; grab the ball
}
func player(name string, table chan *Ball) {
for {
ball := <-table
ball.hits++
fmt.Println(name, ball.hits)
time.Sleep(100 * time.Millisecond)
table <- ball
}
}
Я попал сюда в тупик, и на самом деле не понимаю, почему. Посмотрите на последнюю строку в рутине, я пытаюсь получить значение от канала, как вторая последняя строка. В фоновом режиме два goroutines продолжают цикл и посылают друг другу значение. Кажется, это для меня несколько приемников для табличного переменного канала.
Мой главный вопрос: что у меня есть у второго образца тупик?
Не захватите мяч. Просто закройте канал. Чтобы проверить, что канал уже закрыт, используйте x, ok: = <-c notation. Пример http://play.golang.org/p/N579duQZOg – RoninDev