在go语言的源码中,你会发现代码中只有函数签名,却看不到函数体,比如:
// src/os/proc.go 第 68 行
func runtime_beforeExit() // 在运行时实现
在go语言的源码中,你会发现代码中只有函数签名,却看不到函数体is验证系统网站源码,比如:
// src/os/proc.go 68行 func runtime_beforeExit() // implemented in runtime
这里我们只听到函数签名,而没有听到函数体。 我们全局查找,发现其函数体定义在src/runtime/proc.go中
// os_beforeExit is called from os.Exit(0). //go:linkname os_beforeExit os.runtime_beforeExit func os_beforeExit() { if raceenabled { racefini() } }
它通过 go:linkname 链接函数签名和函数体。 那么我们可以在代码中做到这一点吗? 既然库函数可以这样使用,那么我们是不是也可以在自己的代码结构中使用呢?下面是一个实验方法,一步步实现这样的使用
创建项目目录
$ mkdir 演示 && cd 演示
go mod 初始化项目目录
$ go mod 初始化演示
创建函数签名 pkg 和函数体 pkg
$mkdir hello $mkdir link
编写测试代码
$cd hello // 函数签名 $vim hello.go package hello import ( _ "demo/link" ) func Hello() // 函数体 $vim link.go package link import _ "unsafe" //go:linkname helloWorld demo/hello.Hello func helloWorld() { println("hello world!") }
执行代码
$cd demo vim demo.go package main import ( "demo/hello" ) func main() { hello.Hello() }
编译并运行
go run demo.go # demo/hello hello/hello.go:7:6: missing function body
在hello文件夹下添加aa.s汇编文件标识符,即可编译执行
$cd hello && touch aa.s $go run demo.go hello world!
总结
以上就是小编给大家介绍的go语言中linkname的用法。 希望对您有所帮助。 如果您有疑问is验证系统网站源码,请给我留言,编辑会及时回复您。 非常感谢您对情景之家网站的支持!
发表评论