一尘不染

何时不使用指针构造变量中的文字

go

按照Go 导览第28
第53页

它们显示了一个变量,该变量是指向结构文字的指针。为什么这不是默认行为?我不熟悉C,因此很难将其包裹住。我唯一看到的是使用指针可能不是更有利的时候是结构文字是唯一的,并且不会在其余程序中使用,因此您希望尽快对其进行垃圾回收。我什至不确定像Go这样的现代语言是否也可以那样工作。

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

谢谢。


阅读 142

收藏
2020-07-02

共1个答案

一尘不染

在以下情况下,使用指针而不只是结构文字会有所帮助

  • 结构很大,您将其传递
  • 您想要共享它,那就是所有修改都会影响您的结构,而不是影响副本

在其他情况下,只需使用struct文字就可以了。对于小型结构,您可以像使用an int或an
来思考问题*int:多数情况下,int很好,但有时您传递一个指针,以便接收方可以修改int变量。

在您链接到的Go游览练习中,Vertex结构很小,并且语义上与任何数字都差不多。在我看来,直接将其用作struct并Scaled#53中定义如下函数会很好:

func (v Vertex) Scaled(f float64) Vertex {
    v.X = v.X * f
    v.Y = v.Y * f
    return v
}

因为有

v2 := v1.Scaled(5)

会像

var f2 float32 = f1 * 5

创建一个新的float

这类似于处理标准Time结构(此处定义)的方式,该结构通常保存在type
Time而非not 变量中*Time

但是没有明确的规则,并且根据用途,我很可能会同时保留ScaleScaled

2020-07-02