Golang中的结构体字面量

5
在Go语言中,如果遇到结构体字面量,
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}
)

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

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


1
唯一的区别是 q 是一个指针而不是一个实例。除此之外,差异只在语法上存在。 - Not_a_Golfer
谢谢。那么,结构体字面量只是嵌入源代码中的固定值,就像普通字面量一样吗? - John S Perayil
1
@john。有一些重要的区别。具体来说,您不能创建const结构。 - Ken Bloom
谢谢,您非常有帮助。 - John S Perayil
1个回答

6

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


4
我认为q并不保证一定在堆上,Go会进行基本的逃逸分析,可能只是成为指向栈上其他位置的指针。(事实上,如果它对程序语义没有任何影响,编译器可能直接将其作为值处理)。 - Linear
2
@Jsor:实际上,我确定另一种方式是正确的。如果逃逸分析需要,pr可能在堆上。或许更好的区分是在进行x := py := q拷贝时所需的时间有多长。 - Ken Bloom

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接