golang进阶(八)——隐藏技能go:linkname

原创 2017年12月18日 10:51:29

什么是go:linkname

指令的格式如下:

//go:linkname hello github.com/lastsweetop/testlinkname/hello.hellofunc

go:linkname引导编译器将当前(私有)方法或者变量在编译时链接到指定的位置的方法或者变量,第一个参数表示当前方法或变量,第二个参数表示目标方法或变量,因为这关指令会破坏系统和包的模块化,因此在使用时必须导入unsafe

为什么要用go:linkname

这个指令不经常用,最好也不要用,但理解这个指令可以帮助你理解核心包的很多代码。在标准库中是为了可以使用另一个包的unexported的方法或者变量,在敲代码的时候是不可包外访问的,但是运行时用这个命令hack了一下,就变得可以访问。

最大的作用就是 定向可访问。

示例

// Provided by package runtime.
func hellofunc() string

func Greet() string {
    return hellofunc()
}

Greet()去访问一个没有方法体的方法hellofunc(),IDE一般会提示错误,看到这个之后你就会明白了,这一般是另外一个包有go:linkname的链接

我们再看链接的函数:

//go:linkname hello github.com/lastsweetop/testlinkname/hello.hellofunc
func hello() string {
    return "private.hello()"
}

第一个参数表示当前方法或变量,第二个参数表示需要建立链接方法,变量的路径

在这里例子中hello()只能被hello.hellofunc这里作为链接调用,其他地方是无法访问到这个方法的,只能调用包装过的Greet方法。这个链接过程是在编译时完成的。

注意点

  1. go:linkname可以跨包使用
  2. 跨包使用时,目标方法或者变量必须导入有方法体的包,这个编译器才可以识别到链接
    import _ "github.com/lastsweetop/testlinkname/private"
  3. go build无法编译go:linkname,必须用单独的compile命令进行编译,因为go build会加上-complete参数,这个参数会检查到没有方法体的方法,并且不通过。

源码放在github,地址

版权声明:本文为博主原创文章,未经博主允许不得转载。

Golang横空出世的背景 为什么选择Go

Golang横空出世的背景(为什么选择Go) http://blog.csdn.net/aaron_ye/article/details/8550398 起源及演进 ...
  • muscledex
  • muscledex
  • 2017年05月04日 09:20
  • 334

几款Golang IDE对比

Go语言目前已经在开发者中越发的流行,自然很多人都在寻找合适的IDE来实现代码语法高亮、自动补全以及其他编辑特性。 下面就几种常用的IDE进行对比介绍: 1. Sublime text 这个文本编...
  • rudyn
  • rudyn
  • 2017年06月27日 23:44
  • 21116

OpenWRT上判断客户端在线个数

有两种方式:               一。通过DHCP client分配列表 (缺点:client列表会根据超时时间刷新,一般超时时间为12h,)               二。通过ar...
  • qianguozheng
  • qianguozheng
  • 2014年06月04日 10:17
  • 3922

跟着猫哥学Golang 17 - Channel 进阶

上一章降到了Golang的channel有队列的特性,那么逻辑上很自然地可以引出两个操作: 循环channel元素;关闭channel; 依次循环channel中的内容是很容易理解的,先进先出...
  • 972301
  • 972301
  • 2016年10月02日 23:31
  • 567

如何实现支持数亿用户的长连消息系统 | Golang高并发案例

此文是根据周洋在【高可用架构群】中的分享内容整理而成,转发请注明出处。 周洋,360手机助手技术经理及架构师,负责360长连接消息系统,360手机助手架构的开发与维护。 不知道咱们群名什么时候改为...
  • RandyLeonard
  • RandyLeonard
  • 2016年01月18日 16:52
  • 8378

NASM与link、golink和alink具体例子使用对比

一、OMF文件格式链接:使用import伪指令,import伪指令可以直接使用函数名,而不用给函数名加上_前缀和@number后缀,但import伪指令仅适合于OMF(borland obj)格式输出...
  • huangrl
  • huangrl
  • 2009年12月06日 22:41
  • 1818

解读2016之Golang篇:极速提升,逐步成熟

Go语言已经7岁了!今年8月,Go 1.7如期发布。撰写本稿时,Go 1.8的测试版也出来了。我们正在热切盼望着明年2月的Go 1.8正式版。 如果你关注 TIOBE的编程语言排行榜 就会发现,...
  • andylau00j
  • andylau00j
  • 2016年12月20日 20:28
  • 1988

[Golang]怎么让数据集合支持并发访问?

在go语言里,提倡用信道通讯的方式来替代显式的同步机制。但是我发现有的时候用信道通讯方式实现的似乎也不是很好(暂不考虑效率问题)。 假设有一个帐号的集合,需要在这个集合上实现一些操作,比如查找修改...
  • abv123456789
  • abv123456789
  • 2015年03月11日 10:35
  • 1620

golang进阶(二)——cobra更实用的命令行

+++ title=”golang——cobra更实用的命令行” date=”2017-10-11” tags=[“golang”,”glide”,”docker”] categories=[...
  • lastsweetop
  • lastsweetop
  • 2017年10月11日 10:59
  • 773

OpenWRT简介

OpenWRT是一个高度模块化、高度自动化的嵌入式Linux系统,拥有强大的网络组件和扩展性,常常被用于工控设备、电话、小型机器人、智能家居、路由器以及VOIP设备中。 同时,它还提供了100多个已编...
  • bytxl
  • bytxl
  • 2014年12月15日 14:42
  • 599
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:golang进阶(八)——隐藏技能go:linkname
举报原因:
原因补充:

(最多只允许输入30个字)