Выражение, стоящее за ключевым словом go
, оценивается, и значение функции этого выражения затем выполняется одновременно.
Итак, в вашем примере вызывается oneFunc()
, следовательно, вывод oneFunc
, а метод anotherFunc
для возвращаемого экземпляра вызывается одновременно. Однако ваша программа завершается до того, как горутина может быть запущена, поэтому вы не видите anotherFunc
напечатанным.
Решение: используйте sync.WaitGroup
или каналы для синхронизации.
Чтобы на самом деле (эмпирически) убедиться, что ваш вызов go
выполняется anotherFunc
одновременно, а нет oneFunc
, вы можете распечатать стек в каждой функции и сравнить результат. Пример (в игре):
var wg = sync.WaitGroup{}
func main() {
wg.Add(1)
go oneFunc().anotherFunc()
wg.Wait()
}
func oneFunc() something {
fmt.Println("oneFunc")
buf := make([]byte, 4096)
runtime.Stack(buf, false)
fmt.Println("Stack of oneFunc:", string(buf))
return something{}
}
type something struct{}
func (s something) anotherFunc() {
defer wg.Done()
buf := make([]byte, 4096)
runtime.Stack(buf, false)
fmt.Println("Stack of anotherFunc:", string(buf))
fmt.Println("anotherFunc")
}
Вы увидите что-то вроде этого:
oneFunc
Stack of oneFunc: goroutine 1 [running]:
main.oneFunc()
/tmpfs/gosandbox-342f581d_b6e8aa8b_334a0f88_c8221b7e_20882985/prog.go:20 +0x118
main.main()
/tmpfs/gosandbox-342f581d_b6e8aa8b_334a0f88_c8221b7e_20882985/prog.go:11 +0x50
Stack of anotherFunc: goroutine 2 [running]:
main.something.anotherFunc()
/tmpfs/gosandbox-342f581d_b6e8aa8b_334a0f88_c8221b7e_20882985/prog.go:32 +0xb2
created by main.main
/tmpfs/gosandbox-342f581d_b6e8aa8b_334a0f88_c8221b7e_20882985/prog.go:11 +0x69
anotherFunc
Трассировка стека даже сообщает вам, что две функции выполняются в разных горутинах, поэтому сравнение вызовов методов не требуется.
person
nemo
schedule
05.11.2013