Eu estava aprendendo Go
Channel
. Fiz um pequeno programa abaixo emGo
package main
import "fmt"
func sample(mychan chan string) {
fmt.Println("Go Go Go Go")
fmt.Println("message received from channel is ", <-mychan)
}
func main() {
messageChan := make(chan string)
go sample(messageChan)
messageChan <- "hello"
}
O que está acontecendo é que às vezes ele mostra a declaração "mensagem recebida...". E às vezes não mostra. E sempre mostra a declaração "Go Go Go...". Então por que ele pula a declaração "mensagem recebida". O que é esse comportamento? Estou confuso.
Quando seu
main()
termina, o programa é encerrado antes quesample()
goroutine possa receber (ou imprimir) a mensagem. Esse é um comportamento realmente não determinístico dependendo do agendamento e é por isso que você às vezes vê a mensagem.Você pode modificar seu programa para esperar
sample()
terminar usandosync.WaitGroup
. A única mudança significativa que fiz além disso é que agora chamosample()
de goroutine anônimogo func() {...}()
para poder fazerwg.Done()
quandosample()
ele terminar.Veja https://pkg.go.dev/sync#WaitGroup para mais explicações sobre o que
WaitGroup
acontece.