Я предполагаю, что вы работаете на детской площадке.При использовании Go Playground следует помнить одну вещь: Он имеет фиксированное время и фиксированный псевдослучайный генератор.
Это означает, что вы не можете использовать Playground для наблюдения случайных результатов.,И порядок выполнения Goroutine, или концепции параллелизма Go в целом, основан на равномерной псевдослучайности.
Запустив ваш код на моем терминале, он даст разные результаты:
➜ basic1 GOMAXPROCS=1 ./basic1
a=1 first executed
a=1 second executed
a=1 third executed
Response true
Main executed
➜ basic1 GOMAXPROCS=1 ./basic1
a=1 first executed
a=1 second executed
panic: b != 1
goroutine 6 [running]:
main.main.func2(0xc000012088, 0xc000054060, 0xc0000120a0)
/mnt/f/home/leaf/spike/stackoverflow/concur/basic1/main.go:26 +0x13b
created by main.main
/mnt/f/home/leaf/spike/stackoverflow/concur/basic1/main.go:20 +0xed
➜ basic1 GOMAXPROCS=1 ./basic1
a=1 first executed
a=1 second executed
a=1 third executed
b=1 first executed
Response true
Main executed
Но есть кое-что еще.Как я уже упоминал, одновременный порядок исключений Go является случайным.Нет гарантии того, что будет первым, если только не будет синхронизации.
Синхронизация включает в себя обмен данными по каналам и материалы от sync
.
В вашем коде происходит только одна синхронизация, котораяобщение через c
.Это гарантирует одну вещь: когда main()
goroutine получает свои Response
, по крайней мере , одна из порожденных там goroutines напечатала свою "исключенную".
Нетгарантировать, что какой-либо из них выполняется, ни то, ни другое или только одно выполнено, а также не выполнено ли выполнение goroutine оператора if
, содержащего panic
first .
Edit:
Далеечтение: