Понимание указателей в Go
В мире программирования указатели играют решающую роль в управлении памятью и эффективном доступе к данным. Go, популярный язык, известный своей параллельностью и простотой, использует указатели уникальным образом.
В примере кода Go:
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), а переменная v инициализируется адресом структуры Vertex (&v). Эти два аспекта раскрывают ключевые особенности поведения указателей Go.
Магия вывода метода
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
При вызове v.Abs() с указателем v сгенерированный метод будет вызван автоматически. Эта функция деривации гарантирует, что мы можем использовать как указатели, так и приемники без указателей с одним и тем же именем метода.
Неявное получение адреса
Другой интригующий аспект указателей 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() }
Здесь выражение v.Abs() эквивалентно следующему:
vp := &v vp.Abs()
Go неявно принимает адрес переменной v, что позволяет нам напрямую вызывать метод Abs без явного использования оператора &. Такое неявное получение адреса упрощает код и повышает читаемость.
Влияние на память
Хотя указатели могут влиять на использование памяти, важно отметить, что в обоих сценариях, где мы используем * Vertex и Vertex в качестве приемников методов, использование памяти остается прежним. Обе реализации создают структуру Vertex в куче, и обе получают к ней доступ через указатель. В этом конкретном примере нет никаких преимуществ или недостатков использования памяти при использовании указателя или приемника без указателя.
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3