У меня есть другой выход для println
и fmt.Println
в детекторе гонки, который я не мог объяснить. Я ожидал, что буду гонка, или, по крайней мере, оба, чтобы не было никакой гонки.Разный выход в детекторе гонки для println и fmt.Println
package main
var a int
func f() {
a = 1
}
func main() {
go f()
println(a)
}
И, он находит состояние гонки, как ожидалось.
0
==================
WARNING: DATA RACE
Write by goroutine 5:
main.f()
/home/felmas/test.go:6 +0x30
Previous read by main goroutine:
main.main()
/home/felmas/test.go:11 +0x4d
Goroutine 5 (running) created at:
main.main()
/home/felmas/test.go:10 +0x38
==================
Found 1 data race(s)
Однако этот проект работает без какой-либо обнаруженной гонки.
package main
import "fmt"
var a int
func f() {
a = 1
}
func main() {
go f()
fmt.Println(a)
}
Насколько мне известно, ни одна раса не обнаруживается вовсе не означает, что никакой гонки так не это один из этих недостатков или есть более глубокое объяснение, поскольку println
является встроенной и совершенно особенным?
Это только случайно. Искатель гонки не видит, что гонка f() не выполняется. – JimB
@JimB Если я добавлю 'time.Sleep', чтобы ждать, гонка пока не годится, а 1 -' f'. –
Я вижу. Хотя ваш тест неверен (и сон не является гарантией того, что goroutine будет работать), копирование значения в интерфейс, похоже, вызывает это любопытное поведение. (BTW у детектора гонки гарантировано только отсутствие ложных срабатываний, поэтому он может иногда пропускать вещи) – JimB