在我正在查看的
Go
代码库中,我经常看到类似以下内容:
some_func(&SomeStructType{
some_attribute: get_ptr(some_object.some_var),
....
)}
func get_ptr[T any](val T) *T {
return &val
}
我不明白为什么需要
get_ptr
。这和之间有什么实质性区别吗
some_func(&SomeStructType{
some_attribute: &(some_object.some_var),
....
)}
?
我已经阅读了一些关于 Go 中的垃圾收集和堆/堆栈分配的内容,并且认为我已经掌握了基础知识,但我仍然不明白为什么这里需要帮助程序。
有区别吗?是的,使用
&
调用的函数可以更改源变量,而使用 get_ptr
调用的函数会获取指向副本的指针,但不能:
func main() {
someObject := someObjectType{someVar: 1}
fmt.Println("main before someFunc getPtr SomeVar:", someObject.someVar)
someFunc(&SomeStructType{
someAttribute: getPtr(someObject.someVar),
})
fmt.Println("main after someFunc getPtr SomeVar:", someObject.someVar)
fmt.Println()
fmt.Println("main before someFunc & SomeVar:", someObject.someVar)
someFunc(&SomeStructType{
someAttribute: &someObject.someVar,
})
fmt.Println("main after someFunc & SomeVar:", someObject.someVar)
}
func someFunc(someObject *SomeStructType) {
fmt.Println("someFunc before ++ someAttribute:", *someObject.someAttribute)
*someObject.someAttribute++
fmt.Println("someFunc after ++ someAttribute:", *someObject.someAttribute)
}
someFunc before ++ someAttribute: 1
someFunc after ++ someAttribute: 2
main after someFunc getPtr SomeVar: 1
main before someFunc & SomeVar: 1
someFunc before ++ someAttribute: 1
someFunc after ++ someAttribute: 2
main after someFunc & SomeVar: 2
在 Go Playground 尝试一下。
为什么在您正在查看的代码库中这样做?我不知道,因为我不知道您正在查看哪个代码库。我看到有时会在自动生成的 API 中完成此操作(例如,
AWS Smithy 这样做是为了使所有内容都可选(使用 nil
指针表示“未设置”)),这是一种获取指向文字值的指针的简单方法,因此在那里它被用于不同的目的。但这不是 Go 惯用语。