Im Quellcode der Go-Sprache finden Sie viele Codes, die nur Funktionssignaturen, aber keinen Funktionskörper haben, wie zum Beispiel:
// src/os/proc.go 68行 func runtime_beforeExit() // implemented in runtime
Hier sehen wir nur Die Funktionssignatur, aber nicht den Funktionskörper. Ich konnte den Funktionskörper nicht sehen, also habe ich global gesucht und festgestellt, dass sein Funktionskörper in src/runtime/proc.go definiert ist. Er verbindet die Funktionssignatur und die Funktion body durch go:linkname. Können wir das also im Code implementieren? Da dies in Bibliotheksfunktionen verwendet werden kann, kann es dann auch in unserer eigenen Codestruktur verwendet werden? Das Folgende ist eine experimentelle Methode, um eine solche Verwendung Schritt für Schritt zu implementieren.
Projektverzeichnis erstellen. // os_beforeExit is called from os.Exit(0).
//go:linkname os_beforeExit os.runtime_beforeExit
func os_beforeExit() {
if raceenabled {
racefini()
}
}
$mkdir demo && cd demo
Führen Sie den Code aus
$go mod init demo
Kompilieren und ausführen
$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!") }