Go | 跨包访问非导出符号
Apr 21, 2025
//go:linkname 是 Go 语言中的一个编译指令(compiler directive),用于在编译期间将一个符号(函数或变量)的名称重命名成另一个符号,达到在不同包之间绕过封装直接访问非导出(unexported)标识符的效果。
- 需要导入
unsafe包 - 函数或变量必须声明
使用未导出函数(示例1):
package mypkg
import _ "unsafe"
func privateFunc()
这里 mypkg 包里的 privateFunc 会被链接为 runtime 包中的非导出函数 internalFunc,调用privateFunc() 就是调用的 runtime.internalFunc()。
使用未导出函数(示例2):
package main
import (
_ "unsafe"
_ "github.com/xxx/yyy/zzz" // 确保包被导入
)
func newUUID() string
func main()
使用未导出变量:
package yourpkg
import _ "unsafe"
var someValue int