【发布时间】:2013-02-26 14:31:54
【问题描述】:
我目前正在学习使用 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}
我得到了完全相同的结果。有区别吗(内存方面等)?
【问题讨论】:
-
您好,欢迎来到程序员。诸如此类的直接实施问题在这里是题外话,但在 Stack Overflow 上是主题。我将启动迁移。度过愉快的一天。
-
尝试在所有方法中更改
v,然后在调用后更改原始fmt.Println(),您会看到不同。使用(v Vertex)版本,您将获得原始版本的副本。如果它是在指针上调用的,它会自动为您取消引用。