Я новичок в Go и нахожусь в тупике по поводу того, что кажется довольно редким состоянием гонки с очень маленьким блоком кода, работающим на Linux с версией Go 1.2.Состояние гонки с простым каналом в Go?
В принципе, я создаю канал для int
, запускаю рутину для чтения с канала, а затем записываю на int один канал.
package main
import "fmt"
func main() {
channel := make(chan int)
go func() {
number := <- channel
fmt.Printf("GOT IT: %d\n", number)
}()
fmt.Println("[+] putting num on channel")
channel <- 42
fmt.Println("[-] putting num on channel")
}
Выход около 90% от времени, как и ожидалось:
$ go run test.go
[+] putting num on channel
GOT IT: 42
[-] putting num on channel
Однако около 10% времени, процедура идти просто не читает номер из канала и ничего не выводит :
$ go run test.go
[+] putting num on channel
[-] putting num on channel
Я озадачен, потому что этот код очень похож на пример, в https://gobyexample.com/channels, (который я не имею эту проблему с), за исключением того, что я читаю из канала в моем ходу рутина вместо того, чтобы писать на канал.
Есть ли у меня фундаментальное непонимание того, как работают каналы или что-то еще здесь играет?
Лучший ответ, объясняющий, ПОЧЕМУ, что он НЕ работает, а не предлагает рабочее решение ... – noooooooob