首頁 > 後端開發 > Golang > 實例講解go:linkname怎麼用

實例講解go:linkname怎麼用

藏色散人
發布: 2021-12-17 14:32:56
轉載
2303 人瀏覽過

本文由golang教學專欄跟大家介紹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怎麼用的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
最新問題
golang web mvc 框架該怎麼選
來自於 1970-01-01 08:00:00
0
0
0
使用 golang 還有必要使用 nginx 麼?
來自於 1970-01-01 08:00:00
0
0
0
golang - goroutine 洩漏
來自於 1970-01-01 08:00:00
0
0
0
golang - mac配置gocode + vim自動補齊
來自於 1970-01-01 08:00:00
0
0
0
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板