go語言中linkname的用法

2022-09-24 14:42:24 字數 1295 閱讀 8193

在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()

}它是通過go:linkname把函式簽名和函式體連線在一起的。那麼我們在**中,可以這樣實現麼?既然庫函式中,可以這麼用,那www.cppcns.com我們自己的**結構中是不也可以這麼用?以下通過實驗的方式,一步一步的實現這樣的用法

建立專案目錄

$mkdir demo && cd demo

go mod初始化專案目錄

$程式設計客棧go mod init demo

建立函式簽名pkg和函式體pkg

$mkdir hello

$mkdi程式設計客棧r link

編寫測試**

$cd hello

// 函式簽名

$vim hello.go

package hello

import (

_ "demo/link"

)func hello()

// 函式體

$vim link.go

package link

import _ "unsafe"

//go:linkname helloworld dem

func helloworld()

執行**

$cd demo

vim demo.go

package main

import (

"demo/hello"

)func main()

編譯執行

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 語言中的繼承

go 語言中可以通過匿名field來實現繼承的效果,type t1 struct func t t1 log func t t1 print type t2 struct t2 t2 可以通過t2.log 直接訪問t1的method,就像物件導向的繼承之後一樣訪問,不過這裡要注意的傳遞到log的是t...

Go語言中的常量

常量,一經定義不可更改的量。功能角度看,當出現不需要被更改的資料時,應該使用常量進行儲存,例如圓周率。從語法的角度看,使用常量可以保證資料,在整個執行期間內,不會被更改。例如當預處理器的架構型別,可以保證不被更改。語法如下 const 常量名 可選的型別 常量值 const c1 int 1000g...

go語言中的map

package main import fmt sort func main 同上 var b map int string make map int string 通過make建立map var c make map int string 簡化寫法 d make map int string 設定...