tgoop.com/go_interview_lib/378
Create:
Last Update:
Last Update:
💬 Когда pointer ресивер предпочтительнее использовать, чем value ресивер в Go?
Первая причина — чтобы метод мог изменить значение, на которое указывает его ресивер.
Вторая — чтобы избежать копирования значения при каждом вызове метода. Это может быть более эффективно, если ресивер, например, является большой структурой.
В примере ниже, оба метода Scale
и Abs
имеют тип ресивера *Vertex
, хотя метод Abs
не должен изменять свой ресивер.
package main
import (
"fmt"
"math"
)
type Vertex struct {
X, Y float64
}
func (v *Vertex) Scale(f float64) {
v.X = v.X * f
v.Y = v.Y * f
}
func (v *Vertex) Abs() float64 {
return math.Sqrt(v.X*v.X + v.Y*v.Y)
}
func main() {
v := &Vertex{3, 4}
fmt.Printf("Before scaling: %+v, Abs: %v\n", v, v.Abs())
v.Scale(5)
fmt.Printf("After scaling: %+v, Abs: %v\n", v, v.Abs())
}
В общем случае, все методы для данного типа должны использовать либо только
pointer
ресивер, либо только value
ресивер, чтобы избежать путаницы и обеспечить согласованность.BY Библиотека Go для собеса | вопросы с собеседований
Share with your friend now:
tgoop.com/go_interview_lib/378