没有合适的资源?快使用搜索试试~ 我知道了~
在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 raceena
资源详情
资源评论
资源推荐
go语言中语言中linkname的用法的用法
在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的汇编文件标示,便可以通过编译执行
weixin_38686542
- 粉丝: 1
- 资源: 938
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 基于Python的在线学习与推荐系统设计与实现(论文+源码)-kaic
- 蓝桥杯2024年第十五届省赛真题-前缀总分
- com.qihoo.appstore_300101305-1.apk
- tensorflow-gpu-2.7.1-cp37-cp37m-manylinux2010-x86-64.whl
- tensorflow-2.7.2-cp37-cp37m-manylinux2010-x86-64.whl
- tensorflow-2.7.1-cp39-cp39-manylinux2010-x86-64.whl
- 蓝桥杯2024年第十五届省赛真题-传送阵
- com.qihoo.appstore_300101305.apk
- linux之线程同步一.doc
- keil5配色方案10种
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0