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

實例講解go:linkname怎麼用

藏色散人
藏色散人轉載
2021-12-17 14:32:562217瀏覽

本文由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中文網其他相關文章!

陳述:
本文轉載於:segmentfault.com。如有侵權,請聯絡admin@php.cn刪除