English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Un pointeur en langage de programmation Golang est une variable qui stocke l'adresse mémoire d'une autre variable. Nous pouvons passer un pointeur à une fonction, ou retourner un pointeur d'une fonction en Golang. En C/ c++En C, il est déconseillé de retourner l'adresse d'une variable locale en dehors d'une fonction, car elle sort de son domaine d'application après le retour de la fonction. Par conséquent, il faut dans C/ c++En C, pour retourner un pointeur depuis une fonction, il est nécessaire de définir la variable locale en tant que variable statique.
Exemple :Laissez-moi d'abord voir un C++Exemple, dans le programme suivant, la ligne de code (int lv = n1 * n1;) génère un avertissement, car c'est le code local de la fonction. Pour éviter l'avertissement, configurez-le en variable statique.
// C ++Le programme retourne //Pointeur provenant de la fonction #include <iostream> using namespace std; //Accepte des pointeurs comme type de retour int* rpf(int); int main() { int n = 745; //Affiche la valeur de n cout << n << endl; //Appel de la fonction cout << *rpf(n) << endl; } //Définir la fonction int* rpf(int n1) { //Prendre la variable locale //À l'intérieur de la fonction int lv = n1 * n1; // static int lv = n1 * n1; //C++ Dans cela, cela nous donnera un avertissement //Retourne l'adresse return &lv; }
Avis
prog.cpp: Dans la fonction 'int* rpf(int) :
prog.cpp:24:9: warning: address of local variable 'lv' returned [-Wreturn-local-addr]
int lv = n1 * n1;
Sortie :
745
La principale raison de cette situation est que le compilateur génère toujours une pile pour l'appel de la fonction. Une fois la fonction terminée, la pile de la fonction est également supprimée, ce qui entraîne que les variables locales de la fonction dépassent leur portée. Le la pose en statique résoudra ce problème. Comme les variables statiques conservent leur valeur, même si elles dépassent leur portée.
MaisLe compilateur Go est très intelligent !. Il ne distribue pas de mémoire sur la pile aux variables locales de la fonction. Il allouera cette variable sur la pile. Dans le programme suivant, la variablelvAllouera de la mémoire sur la pile, car le compilateur Go exécutera une analyse d'évasion pour transférer les variables du domaine local.
//Le retour de la fonction Go package main import "fmt" func main() { //Appel de la fonction n := rpf() //Affiche la valeur fmt.Println("La valeur de n : ", *n) } //Définir une fonction avec des entiers //Le pointeur est utilisé comme type de retour func rpf() *int { //Variable locale //Déclaration de l'opérateur court utilisée à l'intérieur de la fonction lv := 100 // Retourne l'adresse de lv return &lv }
Sortie :
La valeur de n : 100
Attention : Le Golang ne fournit pas de support pour les objets comme le C / C ++Toute supporte pour l'algorithme de pointeur de ce genre. Si exécuté, le compilateur générera une erreur, considérant qu'il s'agit d'une opération invalide.
connaissances connexes : Le GopointeuretPassage de pointeur à la fonction