Dans le code source du langage go, vous trouverez beaucoup de codes qui n'ont que des signatures de fonction, mais pas le corps de la fonction, comme par exemple :
// src/os/proc.go 68行 func runtime_beforeExit() // implemented in runtime
Ici on ne voit que la signature de la fonction, mais pas le corps de la fonction. Je n'ai pas pu voir le corps de la fonction, j'ai donc cherché globalement et j'ai découvert que son corps de fonction est défini dans 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() } }
Il connecte la signature de la fonction et la fonction. corps via go:linkname. Alors pouvons-nous implémenter cela dans le code ? Puisque cela peut être utilisé dans les fonctions de la bibliothèque, peut-il également être utilisé dans notre propre structure de code ? Ce qui suit est une manière expérimentale de mettre en œuvre une telle utilisation étape par étape
Créer le répertoire du projet
$mkdir demo && cd demo
go mod initialiser le répertoire du projet
$go mod init demo
Créer le paquet de signature de fonction et le paquet de corps de fonction
$mkdir hello $mkdir link
Écrire le code de test
$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!") }
Exécutez le code
$cd demo vim demo.go package main import ( "demo/hello" ) func main() { hello.Hello() }
Compilez et exécutez
go run demo.go # demo/hello hello/hello.go:7:6: missing function body
Ajoutez la marque du fichier d'assemblage aa.s sous le dossier hello, et vous pourrez compiler et exécuter
$cd hello && touch aa.s $go run demo.go hello world!