Ответ
Горутины в Go работают в одном адресном пространстве процесса, но каждая имеет свой собственный стек. Однако, поскольку память общая, горутины могут технически читать данные из стека другой горутины, если получить указатель на эту область памяти.
Пример:
func main() {
var shared *int
go func() {
x := 42
shared = &x // передача указателя на локальную переменную
}()
time.Sleep(time.Millisecond) // ждём завершения горутины (не для продакшена!)
fmt.Println(*shared) // читаем значение из стека другой горутины
}
Проблемы:
- Гонки данных – если горутина изменит значение, а другая прочитает его без синхронизации.
- Висячие указатели – если горутина завершится, а её стек будет переиспользован.
Решение:
Использовать каналы или sync.Mutex для безопасного обмена данными.