Указатели 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