为了账号安全,请及时绑定邮箱和手机立即绑定

如何在 Go 中获取指向结构内字段的真实指针?

如何在 Go 中获取指向结构内字段的真实指针?

Go
白衣非少年 2022-06-13 17:19:15
我有一个结构,说:type sample struct{   data []float64}现在,我声明一个方法:func (s sample) Get() *[]float64{return &s.data}我试图通过我通过 Get() 获得的指针附加到这个切片func main(){example := sample{[]float64{1,2,3}}//Here I will append:pointerToArray := example.Get()*pointerToArray = append(*pointerToArray, 4)fmt.Println(example.Get()) // still shows only &{1,2,3}}我对为什么会发生这种情况有一个大致的了解:函数 Get 正在返回其本地范围的地址,我通过将结构本身更改为来修复它type sample struct{data *[]float64}代码返回预期的&{1,2,3,4}现在,对于我的问题:无论如何,是否可以通过 getter 方法获取指向结构中字段的真实指针,而不直接在结构中使用指针字段?
查看完整描述

1 回答

?
猛跑小猪

TA贡献1858条经验 获得超8个赞

问题是您已经Get使用结构接收器定义了该方法,而不是在指针上。这意味着当您返回时,您将&s.data获得接收者字段的地址,而不是来自原始结构。您可以通过使用指针接收器简单地解决此问题:


func (s *sample) Get() *[]float64{

    return &s.data

}

这是一个完整的可运行示例(https://play.golang.org/p/AIj8QOYfx85)


package main


import "fmt"


type sample struct {

    data []float64

}


func (s *sample) Get() *[]float64 {

    return &s.data

}


func main() {

    example := sample{[]float64{1, 2, 3}}


    p := example.Get()

    *p = append(*p, 4)

    fmt.Println(example.Get())

}


查看完整回答
反对 回复 2022-06-13
  • 1 回答
  • 0 关注
  • 112 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号