English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Tutoriel de base en Golang

Instructions de contrôle en Golang

Fonction & Méthode en Golang

Structure en Golang

Coupe & Tableau en Golang

Chaîne (String) en Golang

Pointeur en Golang

Interface en Golang

Concurrence en Golang

Exception (Error) en Golang

Autres éléments divers en Golang

Retour de pointeur par fonction en Go

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