В этом коде есть две функции, которые принимают указатель на int, но работают по-разному:
func appendSlice(sl []int, val 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 — изменяет.
Это демонстрирует разницу между изменением локальной копии указателя и изменением значения по адресу.