Я пытаюсь понять каналы в Go. Вот пример кода:Go channels: почему два разных выхода?
package main
import "fmt"
func main() {
m := make(map[int]string)
m[2] = "First Value"
c := make(chan bool)
go func() {
m[2] = "Second Value"
c <- true
}()
fmt.Printf("1-%s\n", m[2])
fmt.Printf("2-%s\n", m[2])
_ = <-c
fmt.Printf("3-%s\n", m[2])
fmt.Printf("4-%s\n", m[2])
}
Иногда выход кода выше был (результат 1):
1-First Value
2-First Value
3-Second Value
4-Second Value
но иногда я получил (результат 2):
1-First Value
2-Second Value
3-Second Value
4-Second Value
После изменение c := make(chan bool)
до c := make(chan bool, 1)
, то же самое произошло: иногда результат 1, иногда результат 2.
Почему?
Будьте осторожны, чтобы карты Go не были потокобезопасными. Вы должны защитить свою карту от одновременного доступа несколькими гортанами с помощью примитива синхронизации, например мьютекса. В противном случае поведение практически не определено. – SirDarius