Почему горутины могут читать из стека друг друга

«Почему горутины могут читать из стека друг друга» — вопрос из категории Golang, который задают на 23% собеседований Golang Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Горутины в Go работают в одном адресном пространстве процесса, но каждая имеет свой собственный стек. Однако, поскольку память общая, горутины могут технически читать данные из стека другой горутины, если получить указатель на эту область памяти.

Пример:

func main() {
    var shared *int
    go func() {
        x := 42
        shared = &x // передача указателя на локальную переменную
    }()
    time.Sleep(time.Millisecond) // ждём завершения горутины (не для продакшена!)
    fmt.Println(*shared) // читаем значение из стека другой горутины
}

Проблемы:

  1. Гонки данных – если горутина изменит значение, а другая прочитает его без синхронизации.
  2. Висячие указатели – если горутина завершится, а её стек будет переиспользован.

Решение:
Использовать каналы или sync.Mutex для безопасного обмена данными.