gpt4 book ai didi

go - 是否将结构初始化为指针

转载 作者:IT王子 更新时间:2023-10-29 01:20:03 26 4
gpt4 key购买 nike

type Vertex struct {
X, Y float64
}

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

d := &Vertex{3, 4}
fmt.Println(d)
}

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

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

我知道第二个是用指针分配,但我看不出这个解决方案在实践中有什么区别。

最佳答案

TL;DR 没有区别1。一个变量是分配在栈上还是堆上取决于它的用途。

我做了一个deep dive在程序集上,Go 从各种初始化和调用案例中生成。 vb 之间生成的程序集几乎相同。需要特别注意的是,d 并未分配在堆栈1 上。

决定一个变量是堆分配还是栈分配的是它的使用方式。将指针传递给仅使用参数作为值的函数不会强制变量分配到堆中。但即使这样也不能保证,该规范允许任何 Go 编译器根据优化或代码生成的需要在堆栈和堆之间自由移动变量。去abstracts away Heap vs Stack正如 C/C++ 抽象出 RAM 与寄存器一样。

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

type Vertex struct {
X, Y float64
}

func PrintPointer(v *Vertex) {
fmt.Println(v)
}

func PrintValue(v *Vertex) {
fmt.Println(*v)
}

func main() {
a := Vertex{3, 4} // not allocated
PrintValue(&a)

b := &Vertex{3, 4} // not allocated
PrintValue(b)

c := Vertex{3, 4} // allocated
PrintPointer(&c)

d := &Vertex{3, 4} // allocated
PrintPointer(d)
}

1:技术上不正确,但如果使用 fmt.Println(*d) 则为真。我在回答我认为你想问的问题时做了一点欺骗。

关于go - 是否将结构初始化为指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19414267/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com