我目前正在学习使用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}我得到了完全相同的结果。有区别吗(在内存方面,等等)?
3 回答
Cats萌萌
TA贡献1805条经验 获得超9个赞
有区别。例如,非指针接收器形式强制该方法在副本上工作。这样,该方法将无法更改对其调用的实例-它只能访问该副本。在时间/内存性能/消耗等方面可能无效。
OTOH,指向实例的指针以及带有指针接收器的方法允许在需要的地方轻松进行实例共享(和变异)。
慕雪6442864
TA贡献1812条经验 获得超5个赞
区别在于通过引用与通过值。
在func f(v Vertex)
参数中将其复制到parameter中v
。在func f(v *Vertex)
指向现有Vertex
实例的指针中传递。
使用方法时,可以为您完成一些解引用,因此您可以拥有一个方法func (v *Vertex) f()
并调用它,而无需先获取指针:v := Vertex{...}; v.f()
。这只是语法糖,AFAIK。
- 3 回答
- 0 关注
- 184 浏览
添加回答
举报
0/150
提交
取消