Go语言中&MyStruct{1,2}结构体实例化语法的适用场景是什么?
关于Go中
&Vertex{1, 2}结构体指针字面量的使用场景 嘿,我完全懂你刚接触Go时对这个语法的困惑!当初我第一次看到&Vertex{1,2}的时候也愣了一下,觉得直接声明结构体再取指针不也行吗?但用多了就发现这个语法在很多场景下特别顺手,下面给你掰扯几个最常用的场景:
1. 直接传递指针给需要修改结构体的函数
很多Go函数(尤其是涉及修改结构体内部状态的函数)要求接收指针类型的参数。如果用&Vertex{1,2},你可以在调用函数时直接创建并传递指针,不用额外声明临时变量:
type Vertex struct { X, Y int } func updateVertex(v *Vertex) { v.X += 10 } func main() { // 直接用字面量创建指针并传入函数,一步到位 updateVertex(&Vertex{1, 2}) }
要是不用这个语法,你得先声明变量再取指针,多写一行冗余代码:
v := Vertex{1,2} updateVertex(&v)
这种写法在临时传递结构体指针的时候特别简洁。
2. 作为构造函数的返回值
当你写一个结构体的构造函数,想要返回结构体的指针而不是值的时候,这个语法能让你一步完成创建与取地址的操作:
func NewVertex(x, y int) *Vertex { // 直接返回新创建的结构体指针,无需先创建值再取地址 return &Vertex{x, y} }
调用NewVertex(1,2)就能直接拿到指向新实例的指针,代码逻辑更连贯。
3. 初始化嵌套结构体的指针字段
如果你的结构体包含指针类型的字段,用这个语法可以直接在嵌套初始化时完成赋值,不用额外步骤:
type Circle struct { Center *Vertex Radius int } func main() { // 直接初始化Center字段为一个Vertex的指针 c := Circle{ Center: &Vertex{1, 2}, Radius: 5, } }
要是不用这个语法,你得先创建Vertex实例,再取地址赋值给Center,代码会啰嗦很多。
4. 在切片或映射中存储结构体指针
当你需要创建一个存储结构体指针的切片/映射时,这个语法可以直接在初始化时添加元素:
func main() { // 直接初始化切片,每个元素都是指向不同Vertex实例的指针 vertices := []*Vertex{ &Vertex{1, 2}, &Vertex{3, 4}, &Vertex{5, 6}, } }
这种场景下,切片里的每个元素都是独立实例的指针,修改其中一个不会影响其他元素;如果存储的是结构体值,修改时还要处理拷贝问题,效率和灵活性都不如指针。
总的来说,&Vertex{1,2}是Go提供的语法糖,把“创建结构体值 + 取地址”两步合并成一步,在需要直接使用指针的场景下能让代码更简洁、紧凑,避免不必要的临时变量声明。
内容的提问来源于stack exchange,提问作者AntoineB




