跨包访问私有结构字段
在 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中文网其他相关文章!