Определение выводимых значений и размера структуры при передаче её по указателю

Сначала и после mutatePtr печатается {false 0 false}; внутри — in mutatePtr: &{true 666 false}. Функция заменяет локальный указатель, а не исходную структуру.

Короткий ответ

Что ответить на собеседовании

Сначала и после mutatePtr печатается {false 0 false}; внутри — in mutatePtr: &{true 666 false}. Функция заменяет локальный указатель, а не исходную структуру.

Подробный разбор

Ответ с пояснениями

Условие

Нужно понять, какие данные будут напечатаны до вызова функции mutatePtr, что выведет сама функция и как изменятся значения после её выполнения. Кроме того, требуется узнать, сколько байтов занимает объявленная структура в памяти.

type st struct {
  // 4 ??? sizeof
  p1 bool
  p2 int
  p3 bool
}

// ptr
func main() {
  myStr := st{}

  fmt.Println(myStr) // 1 ???

  mutatePtr(&myStr)

  fmt.Println(myStr) // 3 ???

  fmt.Println(unsafe.Sizeof(myStr))
}

func mutatePtr(in *st) {
  in = &st{
    p1: true,
    p2: 666,
    p3: false,
  }

  fmt.Println("in mutatePtr:", in) // 2
}

Ответ

Сначала и после mutatePtr печатается {false 0 false}; внутри — in mutatePtr: &{true 666 false}. Функция заменяет локальный указатель, а не исходную структуру.

При обычном Go/amd64 размер st равен 24 байтам: bool, padding до int, 8-байтовый int, bool и завершающее выравнивание. На типичной 32-битной архитектуре — 12 байтам. Это не универсальная константа для всех ABI; unsafe.Sizeof показывает размер в конкретной сборке. Чтобы изменить myStr, запишите *in = st{true, 666, false} или присвойте поля через in.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее