Go中get_ptr辅助函数的必要性:与直接取址的区别疑问
两种写法的实质区别与get_ptr的用处
先直接说结论:在你给出的这个具体例子里,两种写法有实质区别,且get_ptr在这里完全没必要,甚至可能不符合代码的预期逻辑。
核心差异拆解
- 直接用
&some_object.some_var:取的是some_object.some_var这个原变量的内存地址,指针指向的就是原变量本身。后续原变量的值修改时,通过这个指针能读到最新值。 - 用
get_ptr(some_object.some_var):函数get_ptr会先接收some_object.some_var的副本(因为Go函数参数是值传递),然后返回这个副本的地址。也就是说,这个指针指向的是一个临时的副本,和原变量完全是两个独立的内存位置。后续原变量修改,这个指针指向的值不会变。
那为什么代码库里会出现get_ptr?
这个函数的真正用处,是处理无法直接取地址的场景,比如:
- 字面量或临时常量:Go不允许直接取字面量的地址(比如
&5是非法语法),但get_ptr(5)可以——因为函数参数会把字面量复制到栈上,再返回这个副本的地址:// 非法:cannot take address of untyped constant 5 some_func(&SomeStructType{attr: &5}) // 合法 some_func(&SomeStructType{attr: get_ptr(5)}) - 不可寻址的值:比如函数的返回值,Go也不允许直接取地址(
&get_some_val()非法),但get_ptr(get_some_val())可以,原理同上,返回值会被复制到get_ptr的参数里,再取副本地址。 - 统一代码风格:有些团队为了让结构体初始化时的指针赋值写法统一,不管是变量、字面量还是函数返回值,都用
get_ptr包裹,看起来更整齐。
回到你的例子
如果代码里的意图是让some_attribute指向some_object.some_var本身,那用get_ptr是错的——它会创建一个副本,后续原变量的修改不会同步到这个指针指向的值。这种情况下直接用&才是正确且高效的写法。
内容的提问来源于stack exchange,提问作者jinkins
相关产品推荐
相关产品推荐

