在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 設定...