go tour何时不在变量中使用指向struct literal的指针

sac*_*ine 10 pointers go

按照围棋游览第28 第53页

它们显示一个变量,它是指向struct literal的指针.为什么这不是默认行为?我不熟悉C,所以我很难绕过它.我唯一能看到使用指针时更有利的时候是struct literal是唯一的,并且不会用于其余的程序,所以你希望它尽快被垃圾收集.我甚至不确定像Go这样的现代语言是否能以这种方式运作.

我的问题是这个.我应该何时将指向结构文字的指针分配给变量,何时应该分配结构文字本身?

谢谢.

Den*_*ret 13

使用指针而不仅仅是结构文字是有用的

  • 结构很大,你传递它
  • 您希望共享它,即所有修改都会影响您的结构,而不是影响副本

在其他情况下,只需使用struct literal即可.对于一个小结构,你可以考虑使用一个int或一个问题*int:大多数情况下int是正常的,但有时你传递一个指针,以便接收者可以修改你的int变量.

在链接到的Go tour练习中,Vertex结构很小,并且语义与任何数字大致相同.在我看来,将它直接用作结构并Scaled#53中定义函数就好了,如下所示:

func (v Vertex) Scaled(f float64) Vertex {
    v.X = v.X * f
    v.Y = v.Y * f
    return v
}
Run Code Online (Sandbox Code Playgroud)

因为有

v2 := v1.Scaled(5)
Run Code Online (Sandbox Code Playgroud)

会创建一个新的顶点就像

var f2 float32 = f1 * 5
Run Code Online (Sandbox Code Playgroud)

创造一个新的float.

这类似于如何处理标准Time结构(此处定义),它通常保存在类型的变量中Time而不是*Time.

但是没有明确的规则,根据使用情况,我可以很好地保留两者ScaleScaled.

  • 有时您想明确表示无法修改值.在上面的dystroy代码中,Scaled的定义清楚地表明调用v1.Scaled(5)无法修改v1.V1保证不受影响.有时代码看起来更干净而没有指针.然后,您必须深入了解这一点,但有时直接使用结构将避免在堆上进行分配并设法在堆栈上执行更多操作.这可能是效率的一大胜利.实际上,在很多情况下,无论哪种方式都可以完成工作.不要强调它. (3认同)