is验证系统网站源码-go语言中linkname的用法

在go语言的源码中,你会发现代码中只有函数签名,却看不到函数体,比如:

// src/os/proc.go 第 68 行

func runtime_beforeExit() // 在运行时实现

在go语言的源码中,你会发现代码中只有函数签名,却看不到函数体is验证系统网站源码,比如:

网络验证源码论坛_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 链接函数签名和函数体。 那么我们可以在代码中做到这一点吗? 既然库函数可以这样使用,那么我们是不是也可以在自己的代码结构中使用呢?下面是一个实验方法,一步步实现这样的使用

网络验证源码论坛_is验证系统网站源码_开源验证码

创建项目目录

$ mkdir 演示 && cd 演示

go mod 初始化项目目录

$ go mod 初始化演示

开源验证码_is验证系统网站源码_网络验证源码论坛

创建函数签名 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验证系统网站源码,请给我留言,编辑会及时回复您。 非常感谢您对情景之家网站的支持!