我目前正在学习使用Go语言编程。我在理解Go指针时遇到了一些困难(并且我的C / C ++现在很遥远…)。例如,在“第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
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()等效于以下代码:
v.Abs()
vp := &v vp.Abs()