Указатель (pointer) - это переменная, которая содержит адрес объекта.
Структуры и массивы копируются при использовании в присваиваниях и передаются в качестве аргументов функциям. С помощью указателей этого можно избежать.
Указатели хранят адреса объектов. Адреса могут передаваться более эффективно, чем реальные объекты.
Указатель имеет тип *T. Ключевое слово new выделяет новый объект и возвращает его адрес.
type Human struct {
Name string
}
var ps *Human = new(Human)
// ps содержит адрес новой структуры
Объявление переменной можно записать более компактно.
ps := new(Human)
Адресный оператор
Оператор & возвращает адрес объекта.
s := Human{"Алиса"} // s содержит саму структуру
ps := &s // ps содержит адрес структуры
Оператор & также может использоваться с составными литералами. Две строки выше могут быть записаны как
ps := &Human{"Алиса"}
Разыменование указателя
Для указателя x разыменование указателя *x обозначает значение, на которое указывает x. Разыменование указателя используется редко, поскольку Go может автоматически получить адрес переменной.
ps := new(Human)
ps.Name = "Алиса"
// то же что и (*ps).Name = "Алиса"
Указатели как параметры
Используя указатель для изменения объекта, вы влияете на весь код, который использует объект.
// Ivan - это функция, которая не имеет никакого эффекта.
func Ivan(s Human) {
s.Name = "Иван" // изменяет только локальную копию
}
// Oleg устанавливает pp.Name равным "Олег".
func Oleg(ps *Human) {
ps.Name = "Олег"
}
func main() {
s := Human{"Алиса"}
Ivan(s)
fmt.Println(s) // печатает {Алиса}
Oleg(&s)
fmt.Println(s) // печатает {Олег}
}
Читайте также:
- Спецификация Go: типы указателя (pointer types), типы функций (function types)
- Go FAQ: Следует ли определять методы для значений или указателей?
- Основы Go: указатели
Комментариев нет:
Отправить комментарий