Сначала и после 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.