Maison  >  Article  >  développement back-end  >  Exemples pour expliquer comment utiliser go:linkname

Exemples pour expliquer comment utiliser go:linkname

藏色散人
藏色散人avant
2021-12-17 14:32:562215parcourir

Cet article est introduit par la colonne tutoriel golang pour présenter comment utiliser go:linkname. J'espère qu'il sera utile aux amis qui en ont besoin !

Utilisation de go:linkname

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!

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer