go - 如何在 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 方法获取指向结构中字段的真实指针,而不直接在结构中使用指针字段?
解决方案
问题是您已经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())
}
推荐阅读
- python - 用于 R 管道的 Snakemake -- 设置
- php - 无法通过 CodeIgniter 连接到远程数据库
- python - 通过 boto 2.49 连接 AWS S3 时遇到问题
- java - 如何在从 keras 导出的 java 中加载 tensorflow .pb 模型
- visual-studio-code - 如何在 Visual Studio Code 中查找和更改 Java 编译器选项?
- react-native - 使用 PollyJS 在 ReactNative 上拦截 Apollo/GraphQL 请求
- reactjs - onSubmit 不适用于 react.js 使用 Formik 并刷新站点
- email - 需要用于根据 Google 表格单元格值发送电子邮件的脚本代码
- laravel - Laravel:收到带有用户名而不是令牌的密码重置链接
- ms-access - 一对多表单/子表单