go:linkname的官方说明

//go:linkname localname importpath.nameThe //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".

这个指令告诉编译器为当前源文件中私有函数或者变量在编译时链接到指定的方法或变量。因为这个指令破坏了类型系统和包的模块化,因此在使用时必须导入unsafe包,所以可以看到runtime/time.go文件是有导入unsafe包的。
我们看到go:linkname的格式,这里localname自然对应timeSleep, importpath.name就对应time.Sleep,但为什么要这么做呢?
我们知道time.Sleeptime包里,是可导出,而timeSleepruntime包里面,是不可导出了,那么go:linkname的意义在于让time可以调用runtime中原本不可导出的函数,有点hack,举个栗子:

目录结构如下

➜  demo git:(master) ✗ tree
.
├── linkname
│   └── a.go
├── main.go
└── outer└── world.go

文件内容 a.go

package linknameimport _ "unsafe"//go:linkname hello examples/demo/outer.World
func hello() {println("hello,world!")
}

world.go

package outerimport (_ "examples/demo/linkname"
)func World()

main.go

package mainimport ("examples/demo/outer"
)func main() {outer.World()
}

运行如下:

# examples/demo/outer
outer/world.go:7:6: missing function body

难道理解错了,这是因为go build默认加会加上-complete参数,这个参数检查到World()没有方法体,在outer文件夹中增加一个空的.s文件即可绕过这个限制

➜  demo git:(master) ✗ tree
.
├── linkname
│   └── a.go
├── main.go
└── outer├── i.s└── world.go

输出如下:

hello,world!

【转】【GO】9.go:linkname相关推荐

  1. Go 源码里的这些 //go: 指令,go:linkname 你知道吗?

    原文地址: Go 源码里的这些 //go: 指令,你知道吗? 一文解惑 //go:linkname 指令

  2. go:linkname

    转载地址:https://cloud.tencent.com/developer/article/1491065 在go语言的源码中,会发现很多代码只有函数签名,却看不到函数体的函数,如: // sr ...

  3. mac解决//go:linkname must refer to declared function or variable

    mac解决//go:linkname must refer to declared function or variable 1.系统及原因 2.解决方法 1.系统及原因 系统:macbook pro ...

  4. go:linkname must refer to declared function or variable

    下载完 gin 框架之后报错 # golang.org/x/sys/unix ../../../go/pkg/mod/golang.org/x/sys@v0.0.0-20200223170610-d5 ...

  5. 根据进程名杀死进程 -kill进程名

    知道进程名怎样杀死这个进程. #pkill 进程名  或是 #killall 进程名 的确这个两个命令都能做到这些,而且我们平时一般知道进程名需要杀死进程的时候也都是用的这两个命令.可是他叫我用kil ...

  6. C++实现tar包解析

    tar(tape archive)是Unix和类Unix系统上文件打包工具,可以将多个文件合并为一个文件,使用tar工具打出来的包称为tar包.一般打包后的文件名后缀为".tar" ...

  7. 微信小程序 循迹功能制作

    规划地图的路径,实时获取用户当前的定位,进行路线循迹导航功能的开发: 效果图: 实现代码: <map id="map" enable-satellite longitude= ...

  8. 深入解析:TRUNCATE TABLE 的内部原理解析与恢复思路

    摘要 众所周知,truncate table 是一种快速清空表内数据的一种方式,与 delete 方式不同,truncate 只产生非常少的 redo 和 undo,就实现了清空表数据并降低表 HWM ...

  9. Linux纯干货知识总结 | 面试专用

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 作者:阿里技术官方号 https://blog.csdn.net/ ...

最新文章

  1. Android XML: unbound prefix
  2. Seam开发环境中的中文乱码问题
  3. python代码画皮卡丘_程序员式优雅表白,教你用python代码画爱心
  4. 如何提升大规模Transformer的训练效果?Primer给出答案
  5. onenote复制出来是图片_OneNote入门篇
  6. 股票余额理财会影响打新吗?
  7. 镁光ssd管理工具 linux,镁光C400固态硬盘08TH固件及升级软件
  8. vue学习-处理边界-依赖注入
  9. rsync常见问题及解决办法
  10. 如何利用Excel将文字颠倒顺序显示
  11. Excel提示:您的组织策略阻止我们为您完成此操作
  12. /admin/login.php,app/admin/controller/Login.php · 静水流深/wotuoquan - Gitee.com
  13. 小程序如何cdn加速服务器,小程序能用cdn加速吗
  14. Valine-实现QQ邮箱识别生成头像地址(完美解决头像问题)
  15. [Hack The Box] HTB—Bolt walkthrough
  16. oracle11g在linux7的静默安装脚本
  17. Aspose.Words利用Word模板导出Word文档
  18. Interop统计WORD字数
  19. memcpy函数优化及DMA对比
  20. c语言cfile用法,CFile和CArchive的使用

热门文章

  1. 精彩回顾 | Dev.Together 2022 开发者生态峰会圆满落幕
  2. Mark(转载)古人读书十二法
  3. 骁龙778gplus什么水平 骁龙778gplus什么级别 骁龙778gplus相当于什么档次
  4. AI工具是帮手还是助手:
  5. ubuntu解决菜单栏和工具栏消失的方案
  6. 哈曼卡顿连接电脑后,突然变的声音好小的解决办法
  7. 搭建商城的微服务架构-2
  8. 自学编程,10个程序员学习必收藏的编程网站,你知道几个?
  9. 开发行业职业病之~~“键盘手”“鼠标手”“腱鞘炎”
  10. mouse hover时就显示提示信息,太烦了,怎样屏蔽它