我目前正在学习使用 Go 语言进行编程。 我在理解 Go 指针时遇到了一些困难(而且我的 C/C++ 现在还很远......)。 例如,在 Tour of Go #52 (http://tour.golang.org/#52) 中,我读到:
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())
}
但如果不是
func (v *Vertex) Abs() float64 {
[...]
v := &Vertex{3, 4}
我写道:
func (v Vertex) Abs() float64 {
[...]
v := Vertex{3, 4}
甚至:
func (v Vertex) Abs() float64 {
[...]
v := &Vertex{3, 4}
反之亦然:
func (v *Vertex) Abs() float64 {
[...]
v := Vertex{3, 4}
我得到了完全相同的结果。有区别吗(内存方面等)?
最佳答案
您的示例使用了两种不同的 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 := &Vertex{3, 4} v.Abs() // calls the 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() }
表达式
v.Abs()
等价于以下代码:vp := &v vp.Abs()
关于pointers - Golang 指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15096329/