func appendSlice(sl []int, val int) {

В этом коде есть две функции, которые принимают указатель на int, но работают по-разному:

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

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

В этом коде есть две функции, которые принимают указатель на int, но работают по-разному:

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

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

Условие

func appendSlice(sl []int, val int) { sl = append(sl, val) }

func mutateSlice(sl []int, idx, val int) { sl[idx] = val }

package main

import "fmt"

type Person struct { Name string }

func changeName(person *Person) { person = &Person{ Name: "Alice", } }

func main() { person := &Person{ Name: "Bob", } fmt.Println(person.Name) // changeName(person) fmt.Println(person.Name) // }

Ответ

В этом коде есть две функции, которые принимают указатель на int, но работают по-разному:

func updateV1(px *int) {
    x2 := 20
    px = &x2
}

func updateV2(px *int) {
    *px = 20
}

func main() {
    x := 10
    updateV1(&x)
    fmt.Println(x) // Выведет 10
    updateV2(&x)
    fmt.Println(x) // Выведет 20
}

Объяснение:

  • В updateV1 параметр px — это локальная копия указателя. Присвоение px = &x2 меняет только локальную копию, не влияет на переменную x в main.
  • В updateV2 происходит разыменование указателя *px = 20, то есть изменяется значение по адресу, на который указывает px. Это меняет значение x в main.

Итог: updateV1 не изменяет исходную переменную, а updateV2 — изменяет.

Это демонстрирует разницу между изменением локальной копии указателя и изменением значения по адресу.

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

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

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

Подробнее