如何在Golang中访问另一个包的私有函数?

huangapple go评论87阅读模式
英文:

How to access private functions of another package in Golang?

问题

我想访问一个名为"pastry"的包的私有函数。但是它会生成错误信息:
无效的对未导出标识符的引用

请指定在主函数中如何访问golang的私有函数。

英文:

I want to access a private function of a package called "pastry". But it generates error as:
invalid reference to unexported identifier

Specify the way by which private functions of golang are accessible in main.

答案1

得分: 15

你可以使用go:linkname将来自同一/不同包的函数映射到你的某个函数。例如:

package main

import (
	"fmt";

	_ "net"
	_ "unsafe"
)

//go:linkname lookupStaticHost net.lookupStaticHost
func lookupStaticHost(host string) []string

func main() {
	fmt.Println(lookupStaticHost("localhost"))
}

在我的机器上执行时,将输出[127.0.0.1 ::1]

英文:

You can use go:linkname to map functions from same/different package
to some function in yours. For example like:

package main

import (
	"fmt"

	_ "net"
	_ "unsafe"
)

//go:linkname lookupStaticHost net.lookupStaticHost
func lookupStaticHost(host string) []string

func main() {
	fmt.Println(lookupStaticHost("localhost"))
}

will produce [127.0.0.1 ::1] when executed on my machine.

答案2

得分: 8

私有函数在定义上是不可在其所在的包之外访问的。

如果你需要在包之外使用该函数,你必须将其设为公有函数(修改函数名,将首字母改为大写)。

例如:如果你有一个 func doSomething(),将其重命名为 func DoSomething(),然后可以在包之外使用 <包名>.DoSomething()

英文:

Private functions are, by definition, not accessible outside the package in which they are declared.

If you need that function outside that package, you must make it public (change the function name, turning the first letter in upper case).

Eg: if you have func doSomething() rename it to func DoSomething() and use it outside the package with &lt;package name&gt;.DoDomething()

答案3

得分: 7

你还可以添加公共代理函数。

例如:

你有一个包私有函数

func foo() int {
    return 42
}

你可以在同一个包中创建一个公共函数,该函数将调用包私有函数并返回其结果

func Bar() int {
    return foo()
}
英文:

You can also add public proxy-function.

For example:

You have package-private function

func foo() int {
    return 42
}

You can create public function in the same package, which will call the package-private function and return it's result

func Bar() int {
    return foo()
}

答案4

得分: 3

在包(假设为mypackage)中,您有一个名为pastry的函数。请添加以下代码:

var Pastry = pastry

在主包中:

mypackage.Pastry()

请注意,这是一个示例代码,具体实现可能会根据您的需求而有所不同。

英文:

in the package (let's say mypackage) where you have pastry function add:

var Pastry = pastry

in main package:

mypackage.Pastry()

huangapple
  • 本文由 发表于 2016年3月15日 18:59:02
  • 转载请务必保留本文链接:https://go.coder-hub.com/36009327.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定