在go语言的源码中,会发现很多,代码只有函数签名,却看不到函数体,如:
// 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 demo && cd demo
**go mod初始化项目目录**
$go mod init demo
**创建函数签名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!
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。