You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

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

火山引擎 最新活动