您好,登錄后才能下訂單哦!
這篇文章主要介紹“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進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。