go语言中linkname的用法

 更新时间:2019年08月09日 15:30:41   作者:暮雨   我要评论
这篇文章主要介绍了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的汇编文件标示,便可以通过编译执行

$cd hello && touch aa.s
$go run demo.go
hello world!

总结

以上所述是小编给大家介绍的go语言中linkname的用法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

相关文章

  • Go语言的GOPATH与工作目录详解

    Go语言的GOPATH与工作目录详解

    这篇文章主要介绍了Go语言的GOPATH与工作目录详解,本文详细讲解了GOPATH设置、应用目录结构、编译应用等内容,需要的朋友可以参考下
    2014-10-10
  • GO语言实现文件上传代码分享

    GO语言实现文件上传代码分享

    本文给大家分享的是一则使用golang实现文件上传的代码,主要是使用os.Create创建文件,io.Copy来保存文件,思路非常清晰,这里推荐给大家,有需要的小伙伴参考下吧。
    2015-03-03
  • 详解Go开发Struct转换成map两种方式比较

    详解Go开发Struct转换成map两种方式比较

    本篇文章主要介绍了详解Go开发Struct转换成map两种方式比较,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-07-07
  • Golang学习笔记之延迟函数(defer)的使用小结

    Golang学习笔记之延迟函数(defer)的使用小结

    这篇文章主要介绍了Golang学习笔记之延迟函数(defer),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-12-12
  • Go语言的os包中常用函数初步归纳

    Go语言的os包中常用函数初步归纳

    这篇文章主要介绍了Go语言的os包中常用函数初步归纳,用于一些和系统交互功能的实现,需要的朋友可以参考下
    2015-10-10
  • Go语言之自定义集合Set

    Go语言之自定义集合Set

    本文主要介绍的是Go语言的自定义集合Set,文中介绍的很详细,有需要的可以参考学习。
    2016-08-08
  • go语言基础语法示例

    go语言基础语法示例

    这篇文章主要介绍了go语言基础语法示例,介绍了go语言较为全面的基础知识,具有一定参考价值,需要的可以了解下。
    2017-11-11
  • go语言对文件按照指定块大小进行分割的方法

    go语言对文件按照指定块大小进行分割的方法

    这篇文章主要介绍了go语言对文件按照指定块大小进行分割的方法,实例分析了Go语言文件操作的技巧,需要的朋友可以参考下
    2015-03-03
  • Go并发编程实践

    Go并发编程实践

    并发编程一直是Golang区别与其他语言的很大优势,也是实际工作场景中经常遇到的。近日笔者在组内分享了我们常见的并发场景,及代码示例,以期望大家能在遇到相同场景下,能快速的想到解决方案,或者是拿这些方案与自己实现的比较,取长补短。现整理出来与大家共享
    2017-01-01
  • Go语言实现机器大小端判断代码分享

    Go语言实现机器大小端判断代码分享

    这篇文章主要介绍了Go语言实现机器大小端判断代码分享,本文直接给出实现代码,需要的朋友可以参考下
    2014-10-10

最新评论