为了账号安全,请及时绑定邮箱和手机立即绑定

Golang指针

Golang指针

Go
慕村9548890 2021-05-07 15:22:34
我目前正在学习使用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,指向实例的指针以及带有指针接收器的方法允许在需要的地方轻松进行实例共享(和变异)。


查看完整回答
反对 回复 2021-05-31
?
慕雪6442864

TA贡献1812条经验 获得超5个赞

区别在于通过引用与通过值。

func f(v Vertex)参数中将其复制到parameter中v。在func f(v *Vertex)指向现有Vertex实例的指针中传递。

使用方法时,可以为您完成一些解引用,因此您可以拥有一个方法func (v *Vertex) f()并调用它,而无需先获取指针:v := Vertex{...}; v.f()。这只是语法糖,AFAIK。


查看完整回答
反对 回复 2021-05-31
  • 3 回答
  • 0 关注
  • 184 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信