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