Собственно, упражняюсь с горутинами. Есть такой код:
func main() {
var line chan string = make(chan string)
var quit chan int = make(chan int)
var input string
go func() {
for {
fmt.Scan(&input)
if input == "exit" {
quit <- 0
break
}
go calc(line, quit, input)
}
}()
for str := range line {
fmt.Println(str)
}
}
func calc(line chan string, quit chan int, s string) {
defer close(line)
defer close(quit)
select {
case line <- s:
line <- "Echo " + <-line
case <-quit:
line <- "Quit"
return
}
}
В целом всё хорошо, кроме выхода из горутины. Если ввожу «exit», получаю вот такое сообщение о дедлоке:
fatal error: all goroutines are asleep - deadlock!
goroutine 1 [chan receive]:
main.main()
main.go:22 +0x11d
goroutine 6 [chan send]:
main.main.func1()
main.go:16 +0x125
created by main.main in goroutine 1
main.go:12 +0xb9
exit status 2