首页 > 解决方案 > 如何在 Go 中获取指向结构内字段的真实指针?

问题描述

我有一个结构,说:

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 方法获取指向结构中字段的真实指针,而不直接在结构中使用指针字段?

标签: go

解决方案


问题是您已经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())
}

推荐阅读