這篇文章主要介紹“go中linkname怎么用”,在日常操作中,相信很多人在go中linkname怎么用問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”go中linkname怎么用”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
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怎么用”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。