Golang 中的结构体字面量

Joh*_*yil 4 struct go

如果是 Go 中的 Struct Literals,

type Vertex struct {
    X, Y int
}

var (
    p = Vertex{1, 2}  // has type Vertex
    q = &Vertex{1, 2} // has type *Vertex
    r = Vertex{X: 1, Y: 2}
)
Run Code Online (Sandbox Code Playgroud)

p、q 和 r 的值为 {1 2} &{1 2} {1 2}

以上三个变量的初始化方法有什么区别?变量 p、q 和 r 有何不同?

Ken*_*oom 5

q是指向在堆上分配的结构的指针。其他是相同的,并在堆栈上分配。是否列出字段名称纯粹是为了可读性,我建议尽可能这样做。

  • 我不认为 `q` 一定会在堆上,Go 会进行基本的转义分析,它最终可能只是指向堆栈中其他位置的指针。(事实上​​,如果它根本不影响程序语义,我认为可能允许编译器直接将其设为值)。 (4认同)
  • @Jsor:实际上,我知道另一种方式肯定是正确的。如果转义分析需要,`p` 和`r` 可能在堆上。可能更好的区别是在 `x := p` 和 `y := q` 中制作副本需要多长时间。 (2认同)