将结构初始化为指针或不作为指针

Kir*_*Kir 6 go

type Vertex struct {
    X, Y float64
}

func main() {
    v := Vertex{3, 4}
    fmt.Println(v)

    d := &Vertex{3, 4}
    fmt.Println(d)
}
Run Code Online (Sandbox Code Playgroud)

http://play.golang.org/p/XluyUHL2y7

这两种初始化Vertex结构的方法有什么区别?

我知道第二个是指针分配,但我在实践中看不出这个解决方案的任何区别.

dis*_*ted 3

在这两种情况下,Vertex 结构体都以相同的方式初始化。

第一个表达式返回值,该值是已初始化的 Vertex 结构。根据 6g 的对齐规则,这意味着您将获得 8+8 = 16 字节的 Vertex 结构,因为每个 float64 的大小都是 8 字节。第二个表达式分配足够 8+8 = 16 字节的内存,将其用作 Vertex 结构,初始化它并返回一个指针,该指针的大小为 4 或 8 字节,具体取决于您的体系结构。

实践中存在许多差异。这两个值(Vertex 结构体和 *Vertex 指针)的方法集可能不同。根据您需要传递 Vertex 结构的频率,传递指向它的指针可能会更有效,也可能不会更有效。如果将 Vertex 结构传递给函数,该函数将获得一个副本,并且您的 Vertex 结构将永远不会被修改。如果您传递 *Vertex,您的底层 Vertex 可能会更改。这可能是也可能不是您的意图:)