欢迎光临散文网 会员登陆 & 注册

go:linkname注释讲解,使用场景

2023-05-29 23:11 作者:误入歧途的先森  | 我要投稿

读源码的时候我们经常会读着读着 就变成了一个函数没有实现 之后上面带着//go:linkname上面的函数;

为什么会有这种函数呢?首先我们看一个time包的函数:

time.runtimeNano()

查看它的源码:

调用的是这个没有实现方法的函数

//go:linkname localname [importpath.name]

使用[importpath.name]作为源代码中声明的localname的变量或函数。由于该指令可以破坏类型系统和包模块化。因此只有引用了 unsafe 包才可以使用。

因此我们直接看: runtime.nanotime函数:

调用了nanotime1函数
看到这块代码,我们知道肯定是要使用到汇编指令了
按照amd64指令集我们找到了执行的汇编指令

到这里我们知道了,//go:linkname 它有一个很重要的作用:

就是执行一些需要很高性能,但是为了代码简洁,而直接使用了其他包的执行方法,因为这些方法大部分都是一些基础语言中函数实现,因此都集成到了runtime包中。

如果加入我们开发go性能遇到瓶颈,真的需要使用到汇编指令,这块还是需要知道的,如果真的对go汇编比较熟悉的确是一个很牛X的选择(前提是对汇编和机器指令了如指掌)。

    视频内容大部分就是如何在go项目中使用到//go:linkname,举例子:

项目文件结构
需要执行的目标函数myPrint
需要引入 unsafe 和 执行函数的包,另外写一个函数 之后不需要写实现上面加上linkname

就上面的简单例子就可以使用到go:linkname了,go汇编这块后续我也准备出几期视频讲解一下,当然是从简单的开始讲,毕竟汇编不是那么简单的。

有什么疑问可以留言,谢谢

go:linkname注释讲解,使用场景的评论 (共 条)

分享到微博请遵守国家法律