go:linkname 指令的格式如下: //go:linkname hello github.com/lastsweetop/testlinkname/hello.hellofunc go:linkname引导编译器将当前(私有)方法或者变量在编译时链接到指定的位置的方法或者变量,第一个参数表示当前方法或变量,第二个参数表示目标方法或变量,因为这关指令会破坏系统和包的模块化,因此在使用时必须导入unsafe 代码详见:https://github.com/xiazemin/golink 这个指令不经常用,最好也不要用,但理解这个指令可以帮助你理解核心包的很多代码。在标准库中是为了可以使用另一个包的unexported的方法或者变量,在敲代码的时候是不可包外访问的,但是运行时用这个命令hack了一下,就变得可以访问。 比如runtime 包 sema.go文件 //go:linkname notifyListWait sync.runtime_notifyListWait
https://golang.org/cmd/compile/#hdr-Compiler_Directives
C 语言的 #include
一上来不太好说明白 Go 语言里 //go: 是什么,我们先来看下非常简单,也是几乎每个写代码的人都知道的东西:C 语言的 #include。
我猜,大部分人第一行代码都是 #include 吧。完整的就是#include
反射指的是程序借助某种手段检查自己结构的一种能力,通常就是借助编程语言中定义的各种类型(types)。 类型和接口(Types and interfaces) 因为反射是建立在类型系统(the type system)上的,所以让我们从复习Go中的类型开始讲起。