获取变量地址的辅助函数

问题描述 投票:0回答:1

在我正在查看的

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 中的垃圾收集和堆/堆栈分配的内容,并且认为我已经掌握了基础知识,但我仍然不明白为什么这里需要帮助程序。

go pointers garbage-collection
1个回答
0
投票

有区别吗?是的,使用

&
调用的函数可以更改源变量,而使用
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 惯用语。

© www.soinside.com 2019 - 2024. All rights reserved.