go 突破访问限制,访问其他包中的私有变量
0

 前几天翻看 go 的源码的时候,发现了这个问题,
 mutex.go的代码的时候里面的 func throw (string) 这个函数没有方体,
 一般来说只有在接口里定义的方法可以没有方法体。

file

The //go:linkname directive instructs the compiler to use “importpath.name” 
as the object file symbol name for  the variable or function declared as “localname”
in the source code.
Because this directive can subvert the type system and package modularity, 
it is only enabled in files that have imported "unsafe".
这个指令告诉编译器为函数或者变量localname使用importpath.name作为目标文件的符号名。
因为这个指令破坏了类型系统和包的模块化,所以它只能在 import "unsafe" 的情况下才能使用。

go:linkname sync_throw sync.throw func sync_throw(s string) { throw(s) } 在panic.go 中定义的,
通过 go:linkname 指令将将当前(sync_throw)方法在编译时链接到sync.throw,
throw函数是在 runtime/panic.go 中声明的,但是注意看他首字母是小写的,
所以为了突破访问限制, 需要这么声明一下

不卑不亢,不慌不忙

讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

  • 请注意单词拼写,以及中英文排版,参考此页
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`, 更多语法请见这里 Markdown 语法
  • 支持表情,使用方法请见 Emoji 自动补全来咯,可用的 Emoji 请见 :metal: :point_right: Emoji 列表 :star: :sparkles:
  • 上传图片, 支持拖拽和剪切板黏贴上传, 格式限制 - jpg, png, gif
  • 发布框支持本地存储功能,会在内容变更时保存,「提交」按钮点击时清空
  请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!