Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Contoh untuk menerangkan cara menggunakan go:linkname

Contoh untuk menerangkan cara menggunakan go:linkname

藏色散人
藏色散人ke hadapan
2021-12-17 14:32:562217semak imbas

Artikel ini diperkenalkan oleh ruangan tutorial golang untuk memperkenalkan cara menggunakan go:linkname saya harap ia dapat membantu rakan-rakan yang memerlukan.

Penggunaan go:linkname

Dalam kod sumber bahasa go, anda akan menemui banyak kod yang hanya mempunyai tandatangan fungsi tetapi tidak dapat melihat badan fungsi , seperti :

// src/os/proc.go 68行
func runtime_beforeExit() // implemented in runtime

Di sini kita hanya melihat tandatangan fungsi, tetapi bukan badan fungsi Selepas carian global, kami mendapati bahawa badan fungsinya ditakrifkan dalam 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()
    }
}
Ia menghubungkan tandatangan fungsi dan badan fungsi melalui go:linkname. Jadi bolehkah kita melaksanakan ini dalam kod? Memandangkan ini boleh digunakan dalam fungsi perpustakaan, bolehkah ia juga digunakan dalam struktur kod kita sendiri? Berikut ialah kaedah percubaan untuk melaksanakan penggunaan sedemikian langkah demi langkah


Buat direktori projek

$mkdir demo && cd demo

go mod mulakan direktori projek

$go mod init demo

Buat pkg tandatangan fungsi dan pkg badan fungsi

$mkdir hello
$mkdir link

Tulis kod ujian

$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!")
}

Laksanakan kod

$cd demo
vim demo.go
package main

import (
    "demo/hello"
)

func main() {
    hello.Hello()
}

Kompilasi dan jalankan

go run demo.go
# demo/hello
hello/hello.go:7:6: missing function body
Tambahkan tanda fail pemasangan aa.s dalam folder hello, dan anda boleh menyusun dan melaksanakan

$cd hello && touch aa.s
$go run demo.go
hello world!

Atas ialah kandungan terperinci Contoh untuk menerangkan cara menggunakan go:linkname. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:segmentfault.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam