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.
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
包中的 ValueOf
或 Func
函数获取。
指针
指针是一个存储另一个值地址的变量。在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)) }
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!