12

根据 Go tour 第 28页和第 53 页

它们显示了一个变量,该变量是指向结构文字的指针。为什么这不是默认行为?我对C不熟悉,所以很难理解它。我唯一能看到使用指针可能不是更有益的情况是结构文字是唯一的,并且不会用于其余程序,因此您希望尽快将其作为垃圾收集. 我什至不确定像 Go 这样的现代语言是否可以这样工作。

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

谢谢。

4

2 回答 2

13

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

  • 结构很大,你把它传过来
  • 您想共享它,即所有修改都会影响您的结构而不是影响副本

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

在您链接到的 Go tour 练习中,Vertex 结构很小,并且具有与任何数字大致相同的语义。在我看来,直接将它用作 struct 并像这样在#53Scaled中定义函数会很好:

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结构(在此处定义),它通常保存在 typeTime和 not的变量中*Time

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

于 2012-12-07T10:17:12.770 回答
2

大多数时候你想要指针可能是对的,但我个人认为需要显式刷新指针。它使之成为int和之间没有区别MyStruct。他们的行为方式相同。

如果您将此与 C#(一种实现您所建议的语言)进行比较,我会发现它的语义令人困惑:

static void SomeFunction(Point p)
{
    p.x = 1;
}
static void Main()
{
    Point p = new Point();
    SomeFunction(p);
    // what is p.x?
}

取决于是否Point定义为 aclass或 a struct

于 2012-12-09T00:37:49.000 回答