go語(yǔ)言中l(wèi)inkname的用法
在go語(yǔ)言的源碼中,會(huì)發(fā)現(xiàn)很多,代碼只有函數(shù)簽名,卻看不到函數(shù)體,如:
// src/os/proc.go 68行 func runtime_beforeExit() // implemented in runtime
此處我們只看到函數(shù)簽名,卻看不到函數(shù)體,全局搜了一把,發(fā)現(xiàn)它的函數(shù)體卻定義在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把函數(shù)簽名和函數(shù)體連接在一起的。那么我們?cè)诖a中,可以這樣實(shí)現(xiàn)么?既然庫(kù)函數(shù)中,可以這么用,那我們自己的代碼結(jié)構(gòu)中是不也可以這么用?以下通過實(shí)驗(yàn)的方式,一步一步的實(shí)現(xiàn)這樣的用法
創(chuàng)建項(xiàng)目目錄
$mkdir demo && cd demo
go mod初始化項(xiàng)目目錄
$go mod init demo
創(chuàng)建函數(shù)簽名pkg和函數(shù)體pkg
$mkdir hello $mkdir link
編寫測(cè)試代碼
$cd hello // 函數(shù)簽名 $vim hello.go package hello import ( _ "demo/link" ) func Hello() // 函數(shù)體 $vim link.go package link import _ "unsafe" //go:linkname helloWorld demo/hello.Hello func helloWorld() { println("hello world!") }
執(zhí)行代碼
$cd demo vim demo.go package main import ( "demo/hello" ) func main() { hello.Hello() }
編譯運(yùn)行
go run demo.go # demo/hello hello/hello.go:7:6: missing function body
在hello文件夾下添加aa.s的匯編文件標(biāo)示,便可以通過編譯執(zhí)行
$cd hello && touch aa.s $go run demo.go hello world!
總結(jié)
以上所述是小編給大家介紹的go語(yǔ)言中l(wèi)inkname的用法,希望對(duì)大家有所幫助,如果大家有任何疑問請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
如果你覺得本文對(duì)你有幫助,歡迎轉(zhuǎn)載,煩請(qǐng)注明出處,謝謝!
相關(guān)文章
Goland使用delve進(jìn)行遠(yuǎn)程調(diào)試的詳細(xì)教程
網(wǎng)上給出的使用delve進(jìn)行遠(yuǎn)程調(diào)試,都需要先在本地交叉編譯或者在遠(yuǎn)程主機(jī)上編譯出可運(yùn)行的程序,然后再用delve在遠(yuǎn)程啟動(dòng)程序,本教程會(huì)將上面的步驟簡(jiǎn)化為只需要兩步,1,在遠(yuǎn)程運(yùn)行程序2,在本地啟動(dòng)調(diào)試,需要的朋友可以參考下2024-08-08Go語(yǔ)言實(shí)現(xiàn)管理多個(gè)數(shù)據(jù)庫(kù)連接
在軟件開發(fā)過程中,使用?MySQL、PostgreSQL?或其他數(shù)據(jù)庫(kù)是很常見的,由于配置和要求不同,管理這些連接可能具有挑戰(zhàn)性,下面就來和大家聊聊如何在Go中管理多個(gè)數(shù)據(jù)庫(kù)連接吧2023-10-10Go語(yǔ)言多人聊天室項(xiàng)目實(shí)戰(zhàn)
這篇文章主要為大家詳細(xì)介紹了Go語(yǔ)言多人聊天室項(xiàng)目實(shí)戰(zhàn),實(shí)現(xiàn)單撩或多撩等多種功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-08-08Golang打包go項(xiàng)目部署到linux服務(wù)器正確方法
這篇文章主要給大家介紹了關(guān)于Golang打包go項(xiàng)目部署到linux服務(wù)器的正確方法,Go?是一個(gè)開源的編程語(yǔ)言,它能讓構(gòu)造簡(jiǎn)單、可靠且高效的軟件變得容易,具有簡(jiǎn)潔、快速、安全,并行、有趣、開源,內(nèi)存管理、v數(shù)組安全、編譯迅速的特征,需要的朋友可以參考下2023-10-10golang?struct?json?tag的使用以及深入講解
這篇文章主要給大家介紹了關(guān)于golang?struct?json?tag的使用以及深入講解,文中通過實(shí)例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2022-02-02GO語(yǔ)言創(chuàng)建錢包并遍歷錢包(wallet)的實(shí)現(xiàn)代碼
比特幣錢包實(shí)際上是一個(gè)密鑰對(duì),當(dāng)你安裝 一個(gè)錢包應(yīng)用,或者是使用一個(gè)比特幣客戶端來生成一個(gè)新地址是,他就會(huì)為你生成一個(gè)密鑰對(duì),今天通過本文給大家分享go語(yǔ)言遍歷錢包的相關(guān)知識(shí),一起看看吧2021-05-05