Встроенный указатель в Go
Вместо значения внутреннего типа можно встроить указатель на него. Запись в объявлении ставит звездочку перед именем типа. Тогда внешнее значение делит одну внутреннюю запись с тем, кто хранит этот указатель.
Пока указатель пуст, обращение к поднятому полю через внешнее значение останавливает программу. Ниже рабочий вариант, где указатель уже задан:
package main
import "fmt"
type Address struct {
City string
}
type User struct {
*Address
Name string
}
func main() {
u := User{
Address: &Address{City: "oslo"},
Name: "ann",
}
fmt.Println(u.City)
u.Address.City = "berlin"
fmt.Println(u.City)
}
Город читают как поднятое поле. Запись через
u.Address меняет ту же память, поэтому
повторное чтение коротким путем показывает
новый текст. Без инициализации указателя
такой доступ не безопасен.
В литерале внешней структуры для указателя берут адрес готового значения или переменной внутреннего типа, как при обычной работе с указателями.
Дана структура:
package main
import "fmt"
type Address struct {
City string
}
type User struct {
*Address
Name string
}
u := User{
Address: &Address{City: "oslo"},
Name: "ann",
}
Измените город через поднятое поле и выведите
его через Address.
Дан следующий код:
package main
import "fmt"
type Address struct {
City string
}
type User struct {
*Address
Name string
}
var u User
Скажите, что произойдет при чтении города
у u без присваивания указателя.
Объявите User со встроенным *Address,
создайте значение с непустым указателем
и выведите поднятое поле.