среда, 29 апреля 2020 г.

Указатели по-простому в Golang

Указатель (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) // печатает {Олег}
}


Читайте также:


Комментариев нет:

Отправить комментарий