В представленном коде есть ошибка компиляции, так как функция a ожидает указатель на строку (string), а в main передаётся &p, где p уже является указателем на строку (string), то есть тип string.
package main
В представленном коде есть ошибка компиляции, так как функция a ожидает указатель на строку (string), а в main передаётся &p, где p уже является указателем на строку (string), то есть тип string.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
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) // }
Ответ
В представленном коде есть ошибка компиляции, так как функция a ожидает указатель на строку (*string), а в main передаётся &p, где p уже является указателем на строку (*string), то есть тип **string.
Если исправить вызов функции на a(p), то код будет работать следующим образом:
package main
import (
"fmt"
)
func a(p *string) {
s2 := "string2"
*p = s2
}
func main() {
str1 := "string1"
p := &str1
fmt.Println(*p) // Выведет: string1
a(p) // Передаём указатель на str1
fmt.Println(*p) // Выведет: string2
}
Объяснение:
- В
mainпеременнаяstr1содержит строку "string1". p— указатель наstr1.- Функция
aпринимает указатель на строку и изменяет значение по этому указателю на "string2". - После вызова
a(p)значениеstr1изменится на "string2".
Если же оставить a(&p), то это будет указатель на указатель (**string), что не соответствует объявлению функции и вызовет ошибку компиляции.