Maison  >  Article  >  développement back-end  >  La relation subtile entre les adresses de fonction Golang et les pointeurs

La relation subtile entre les adresses de fonction Golang et les pointeurs

WBOY
WBOYoriginal
2024-04-08 16:45:02503parcourir

L'adresse de la fonction pointe vers l'adresse mémoire de la fonction elle-même, tandis que le pointeur pointe vers l'adresse mémoire de la variable ou de la structure. Cependant, les adresses de fonctions peuvent également être stockées dans des pointeurs, ce qui nous permet d'appeler des fonctions via des pointeurs. Ces concepts sont utiles dans divers scénarios, tels que l'appel dynamique de fonctions ou la création de fonctions de rappel.

Golang 函数地址与指针的微妙关系

Adresse de fonction et pointeur en Go : relation subtile

Dans le langage Go, l'adresse de fonction et le pointeur semblent être similaires, mais il existe des différences subtiles entre eux. Comprendre leurs différences est essentiel pour écrire un code efficace et maintenable.

Adresse de fonction

L'adresse de fonction est l'adresse pointant vers l'emplacement mémoire de la fonction elle-même. Il peut être obtenu via le littéral func généré par le compilateur ou la fonction ValueOf ou Func dans le package reflect. func 字面字或 reflect 包中的 ValueOfFunc 函数获取。

指针

指针是一个存储另一个值地址的变量。在Go中,指针可以通过 * 符号和类型名称声明。例如,*int 是一个指向整数值的指针。

它们之间的关系

函数地址和指针指向不同的东西。函数地址指向函数本身的内存地址,而指针指向变量或结构的内存地址。但是,函数地址也可以存储在指针中。

在以下示例中:

func myFunc() {}
var fptr = &myFunc

fptr 是一个指针,指向函数 myFunc

Pointeur

Un pointeur est une variable qui stocke l'adresse d'une autre valeur. Dans Go, les pointeurs peuvent être déclarés via des symboles * et des noms de types. Par exemple, *int est un pointeur vers une valeur entière.

La relation entre eux

🎜🎜Les adresses de fonction et les pointeurs pointent vers différentes choses. Une adresse de fonction pointe vers l'adresse mémoire de la fonction elle-même, tandis qu'un pointeur pointe vers l'adresse mémoire d'une variable ou d'une structure. Cependant, les adresses de fonction peuvent également être stockées dans des pointeurs. 🎜🎜Dans l'exemple suivant : 🎜
(*fptr)() // 等同于 myFunc()
🎜fptr est un pointeur pointant vers l'adresse de la fonction myFunc. Cela nous permet d'appeler des fonctions via des pointeurs : 🎜
package main

import (
    "fmt"
    "math"
)

// 计算半径的函数
func radius(n int) float64 {
    return float64(n) / 2.0
}

// 求一个数字的根的函数
func sqrt(n int) float64 {
    return math.Sqrt(float64(n))
}

var operations = map[string]func(int) float64{
    "radius": radius,
    "sqrt":    sqrt,
}

func main() {
    input := "sqrt"
    num := 9

    // 通过名称获取函数指针
    op := operations[input]

    // 调用函数并打印结果
    fmt.Println(op(num))
}
🎜🎜Exemples pratiques🎜🎜🎜Les adresses de fonction et les pointeurs sont utiles dans divers scénarios. Voici un exemple pratique qui utilise ces concepts : 🎜rrreee🎜 Cet exemple montre comment stocker les adresses de fonctions dans un dictionnaire et les appeler dynamiquement par nom de fonction au moment de l'exécution. 🎜

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:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn