1. 简介:
在golang中,无法公开访问未公开名称造成了很多程序员的困扰。下面我们将介绍如何解决此问题。
2. 错误信息:
当试图在不同的包中使用一个只有在包内部可见的名称时,编译器会抛出以下错误:cannot refer to unexported name 'name' in package 'pkg'
3. 名称可见性:
在编写golang代码时,有两种名称可见性:
对其他包的代码可见:使用首字母大写的名称
仅限于本地包:使用首字母小写的名称
4. 解决方案:
4.1. 导入包并使用公开的名称:
这是在其他包中使用名称的最有效方法。在其他包中导入指定包时,只能访问公开的名称。例如,您可以在'pkg'中公开名称并导出如下:
package mypkg
var ExportedName int = 42
然后,如果我们想在'main'包中使用此名称,需要导入并使用“mypkg.ExportedName”,如下所示:
package main
import "mypkg"
func main() {
fmt.Println(mypkg.ExportedName)
}
4.2. 将名称传递给公开函数:
如果不想公开名称本身,但仍希望使用名称的值,可以将名称传递给公开函数。这使您可以公开值而不显式公开名称。
例如,您可以在“pkg”中声明一个仅限制于本地包的名称:
package mypkg
var unexportedName int = 42
func GetUnexportedName() int {
return unexportedName
}
这允许在“mypkg”包内部使用名称,但不允许在其他包中使用名称。然后,我们可以在'main'包中使用以下代码来使用名称:
package main
import "mypkg"
func main() {
fmt.Println(mypkg.GetUnexportedName())
}
4.3. 使用反射访问未公开的名称:
一种“hack”方法是使用反射包访问私有变量和方法。虽然这种方法是有效的,但是它不建议使用,因为它破坏了golang的类型安全性和封装性。
5. 总结:
在golang中,您无法从其他包中访问本地包中的未公开名称。有多种方法可以解决此问题,例如公开名称,将名称传递给公开函数或使用反射来访问名称。建议公开名称或使用公开函数,并尽量避免使用反射。