首页 > 后端开发 > Golang > 如何跨包访问 Go 中的私有结构体字段?

如何跨包访问 Go 中的私有结构体字段?

Patricia Arquette
发布: 2024-12-22 04:26:11
原创
162 人浏览过

How Can I Access Private Struct Fields in Go Across Packages?

跨包访问私有结构字段

在 Go 中,使用私有结构字段封装数据以强制数据隐藏是常见的做法。但是,在某些情况下,可能需要从另一个包访问这些私有字段,例如出于白盒测试目的。

基于反射的方法(Go

使用反射,可以读取 1.7 之前的 Go 版本中的私有结构体字段。这是一个示例:

import (
    "fmt"
    "reflect"

    "github.com/other-package/foo"
)

func readFoo(f *foo.Foo) {
    v := reflect.ValueOf(*f)
    y := v.FieldByName("y")
    fmt.Println(y.Interface())
}
登录后复制

此方法允许您读取私有字段,但尝试修改它们将导致恐慌。

基于不安全的方法(Go ≥ 1.7)

在 Go 1.7 及更高版本中,可以采用使用 unsafe 包的更直接的方法来读取和修改私有结构字段。但是,不鼓励这种方法,因为它依赖于低级指针操作,并且很容易导致内存损坏和其他问题。下面是一个示例:

import (
    "unsafe"

    "github.com/other-package/foo"
)

func changeFoo(f *foo.Foo) {
    ptrTof := unsafe.Pointer(f)
    ptrTof = unsafe.Pointer(uintptr(ptrTof) + unsafe.Sizeof(foo.Foo{}.x))
    ptrToy := (**foo.Foo)(ptrTof)
    *ptrToy = nil
}
登录后复制

替代方法

为了在促进白盒测试的同时保持封装性,请考虑以下替代方法:

  • 暴露一个专用方法:导出原包中提供受控的方法访问私有字段。
  • 使用嵌入类型:在需要访问私有字段的包中创建嵌入类型,并导出该嵌入类型。

以上是如何跨包访问 Go 中的私有结构体字段?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板