func operation(ch chan<- string) {
// Имитация длительной операции
time.Sleep(2 * time.Second)
ch <- "результат операции"
}
func main() {
ch := make(chan string)
go operation(ch)
select {
case res := <-ch:
fmt.Println(res)
case <-time.After(1 * time.Second):
fmt.Println("Тайм-аут операции")
}
}
Автор, в данном примере есть потенциальная утечка горутины. Понятно, что в данном случае у вас выход из программы сразу происходит, но для людей, читающих ваш пример, может создастся впечатление, что так нужно делать всегда, независимо от контекста.
Я бы добавил небольшую пометку о том, что тут будет "повисшая" горутина: и она будет висесть, пока из канала не прочитают.
Либо, можно было бы этот пример реализовать через буферизованный канал с величиной буфера '1', тогда рутина не повиснет на 4ой строчке.
Автор, в данном примере есть потенциальная утечка горутины. Понятно, что в данном случае у вас выход из программы сразу происходит, но для людей, читающих ваш пример, может создастся впечатление, что так нужно делать всегда, независимо от контекста.
Я бы добавил небольшую пометку о том, что тут будет "повисшая" горутина: и она будет висесть, пока из канала не прочитают.
Либо, можно было бы этот пример реализовать через буферизованный канал с величиной буфера '1', тогда рутина не повиснет на 4ой строчке.