«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Как Go обрабатывает указатели и приемники значений в методах?

Как Go обрабатывает указатели и приемники значений в методах?

Опубликовано 16 ноября 2024 г.
Просматривать:437

How Does Go Handle Pointer and Value Receivers in Methods?

Указатели Go: типы получателей и значений

В Go указатели незаменимы для понимания объектно-ориентированного программирования и управления памятью. При работе с указателями очень важно понимать разницу между типами получателей в методах.

Приведенный вами пример Go Tour иллюстрирует эту концепцию:

type Vertex struct {
    X, Y float64
}

func (v *Vertex) Abs() float64 {
    return math.Sqrt(v.X*v.X   v.Y*v.Y)
}

func main() {
    v := &Vertex{3, 4}
    fmt.Println(v.Abs())
}

Здесь метод Abs получает приемник указателя (*Vertex). Однако вы заметили, что вы также можете использовать приемник значений (Vertex) и получить тот же результат. Как это возможно?

Типы получателей и значений

Go допускает производные методы. Метод с приемником указателя может наследовать от метода с приемником значения. Это означает, что метод приемника значения, например func (v Vertex) Abs() float64, автоматически генерирует метод приемника указателя:

func (v Vertex) Abs() float64 { return math.Sqrt(v.X*v.X v.Y*v.Y) }
func (v *Vertex) Abs() float64 { return Vertex.Abs(*v) }  // GENERATED METHOD

Автоматический прием адреса

Другая важная функция — Go автоматическое получение адреса. Рассмотрим следующий код без явного приемника указателя:

func (v *Vertex) Abs() float64 { return math.Sqrt(v.X*v.X v.Y*v.Y) }
func main() {
    v := Vertex{3, 4}
    v.Abs()
}

Go неявно принимает адрес значения, переданного в метод Abs. Это эквивалентно следующему:

vp := &v
vp.Abs()

Заключение

В Go понимание роли типов получателей и функции автоматического получения адреса имеет решающее значение для эффективного использования указателей. Вы можете получить методы приема указателей из методов приема значений, и Go будет автоматически передавать адреса значений без явного использования указателей.

Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3