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()) }您提供的 Go Tour 範例說明了這個概念:type Vertex struct { X、Y 浮點數64 } func (v *Vertex) Abs() float64 { 返回 math.Sqrt(v.X*v.X v.Y*v.Y) } 函數主() { v := &頂點{3, 4} fmt.Println(v.Abs()) }
這裡,Abs方法接收一個指標接收者(*Vertex)。但是,您注意到您也可以使用值接收器(Vertex)並獲得相同的結果。這怎麼可能?
接收器和值類型
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()) }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
自動取地址
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()) }Go的另一個重要特性自動取得位址。考慮以下沒有明確指標接收器的程式碼:func (v *Vertex) Abs() float64 { return math.Sqrt(v.X*v.X v.Y*v.Y) } 函數主() { v := 頂點{3, 4} v.Abs() }
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()) }Go 隱含取得傳遞給 Abs 方法的值的位址。這相當於以下內容:
vp := &v vp.Abs()
結論
在 Go 中,理解接收者類型的作用和自動取位址功能對於有效使用指標至關重要。您可以從值接收器方法派生指標接收器方法,Go 將自動傳遞值的位址,而無需明確使用指標。
免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。
Copyright© 2022 湘ICP备2022001581号-3