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)並獲得相同的結果。這怎麼可能?
接收者和值類型
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 將自動傳遞值的位址,而無需明確使用指標。
以上是Go 如何處理方法中的指標和值接收者?的詳細內容。更多資訊請關注PHP中文網其他相關文章!