你好。一段时间以来,我一直试图 100% 理解这个主题。我阅读了俄语的解释和文档(我正在阅读围棋之旅)。此示例(以及与链接相关的其余部分)出现了问题:
package main
import (
"fmt"
"math"
)
type Vertex struct {
X, Y float64
}
func (v *Vertex) Abs() float64 {
return math.Sqrt(v.X*v.X + v.Y*v.Y)
}
func AbsFunc(v *Vertex) float64 {
return math.Sqrt(v.X*v.X + v.Y*v.Y)
}
func main() {
v := Vertex{3, 4}
fmt.Println(v.Abs())
fmt.Println(AbsFunc(&v))
p := &Vertex{4, 3}
fmt.Println(p.Abs())
fmt.Println(AbsFunc(p))
}
我理解这一点(以下变量取自我的头脑,不适用于上面的示例):
- 我:= 5
- a := &i - output &a会给我们一个a的引用,a会给我们一个i的引用,*a会给我们i 的值。
如果是这样,那么(现在上面代码示例中的所有内容) fmt.Println(AbsFunc(&v))
-如果我们需要将 v *Vertex 传递给函数,即值本身,为什么这里要通过引用传递值?同样在这里 -
fmt.Println(p.Abs())
fmt.Println(AbsFunc(p))
出于某种原因,我们正在传递一个引用&Vertex{4, 3}
而不是一个值......
因为声明
v *Vertex
说那是指向. 因此,我们必须传递指针。而操作无非就是取地址。那些。同一个指针的计算v
Vertex
&
Go中没有引用。只有指针。
链接——指的是内存位置。指针——指向全局对象表中的一个对象(垃圾收集器需要)。如果内存中的对象被移动,存储在指向被移动对象的指针中的引用就会改变。全局表中指针的值(即行号)保持不变。