【问题标题】:Access private fields of a package in golang using reflect [duplicate]使用反射访问golang中包的私有字段
【发布时间】:2021-07-29 08:52:19
【问题描述】:

我正在为 golang 中的包编写单元测试。我需要创建一个私有字段类型的变量,该变量驻留在不同的包中,以将其作为参数传递给我正在测试的函数。

包:go/abc/a.go

type newType int

包:go/edf/b.go

import "go/abc"

func init(abc newType){
  // ommitted for brevity 
}

现在我正在为 b.go say 编写单元测试

包:go/edf/b_test.go

func TestInit(){
// Now I need to create a variable of private field type newType in abc package
// for passing as parameter to the init function....   
}

是否可以在 golang 中使用 reflectpackages 包来实现这一点

【问题讨论】:

  • 请注意,在 Go 中,顶级 init 函数保留用于预执行初始化。并且要求它们的类型是func()(没有输入参数,没有输出参数),因此即使您的func init(abc newType) { 可以访问newType,它也不会编译。

标签: go


【解决方案1】:

我需要访问包中的私有字段

你不能这样做。未导出(您称之为私有)的唯一目的是无法从外部访问。

【讨论】:

  • 但是在其他编程语言中也是可能的,比如 java....
  • 我使用 golang 中的“packages”包以某种方式访问​​了私有字段元数据信息
  • @naveen 如果“'packages' 包”是指golang.org/x/tools/go/packages 包,那么您应该知道该包处理 Go 源代码而不是运行时。如果您想在运行时访问某些内容,最好确保它已导出,即不是私有的。
  • @naveen 还注意到,仅仅因为某些语言允许通过反射访问私有属性,并不意味着所有其他语言都必须效仿。
  • @naveen “但是在其他编程语言中也是可能的,比如 java....” 在其他语言中可能发生的事情在 Go 中是无关紧要的。
猜你喜欢
  • 2012-01-23
  • 1970-01-01
  • 2011-04-03
  • 2015-07-08
  • 1970-01-01
  • 2012-10-03
  • 2010-11-17
  • 1970-01-01
  • 2021-12-02
相关资源
最近更新 更多