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 bodyTambahkan 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!