日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
實(shí)例講解go:linkname怎么用

本文由
golang教程欄目給大家介紹go:linkname怎么用,希望對(duì)需要的朋友有所幫助!

go:linkname的用法

在go語言的源碼中,會(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)么?既然庫函數(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
$cd hello && touch aa.s
$go run demo.go
hello world!

當(dāng)前名稱:實(shí)例講解go:linkname怎么用
標(biāo)題URL:http://www.dlmjj.cn/article/coigojg.html