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

Golang Grundtutorials

Golang Kontrollanweisung

Golang Funktion & Methode

Golang Struktur

Golang Schnittstelle & Array

Golang Zeichenkette (String)

Golang Zeiger

Golang Schnittstelle

Golang Konkurrenz

Golang Ausnahme (Error)

Andere Golang-Mischung

Go-Funktion gibt Zeiger zurück

In der Programmiersprache Golang ist ein Zeiger eine Variable, die die Speicheradresse einer anderen Variable speichert. Wir können Zeiger an Funktionen übergeben und Zeiger aus Funktionen in Golang zurückgeben. In C/ c++Es wird nicht empfohlen, die Adresse einer lokalen Variable außerhalb einer Funktion zurückzugeben, da sie nach dem Rückgabe des Funktionsaufrufs aus dem Gültigkeitsbereich herausfällt. Daher muss in C/ c++Um einen Zeiger von einer Funktion zurückzugeben, muss die lokale Variable als statische Variable definiert werden.

Beispiel:让我先来看个C++示例,在下面的程序中,代码行(int lv = n1 * n1;)将发出警告,因为它是该函数的本地代码。为避免警告,请将其设置为静态变量。

// C ++程序返回
//来自函数的指针
#include <iostream> 
using namespace std; 
  
//接受具有指针作为返回类型
int* rpf(int); 
  
int main() 
{ 
  
    int n = 745; 
  
    //显示n的值
    cout << n << endl; 
  
    //调用函数
    cout << *rpf(n) << endl; 
} 
  
//定义函数 
int* rpf(int n1) 
{ 
  
        //取局部变量
        //在函数内部
    int lv = n1 * n1; 
  
        
    // static int lv = n1 * n1; 
  
    //C++ 中 这将给我们抛出警告
    //返回地址
    return &lv; 
}

警告事项

prog.cpp: In function ‘int* rpf(int)’:
prog.cpp:24:9: warning: address of local variable ‘lv’ returned [-Wreturn-local-addr]
int lv = n1 * n1;

输出:

745

这种情况下的主要原因是编译器始终为函数调用生成堆栈。一旦函数退出,函数堆栈也会被删除,这会导致函数的局部变量超出范围。将其设置为静态将解决该问题。由于静态变量具有保留其值的属性,即使它们超出其范围也是如此。

但是Go编译器非常智能!。它不会将堆栈上的内存分配给该函数的局部变量。它将在堆上分配此变量。在下面的程序中,变量lv将在堆上分配内存,因为Go编译器将执行转义分析以从本地范围转义变量。

//Go 函数返回指针
package main
import "fmt"
func main() {
    //调用函数
    n := rpf()
    //显示值
    fmt.Println("n的值: ", *n)
}
//定义具有整数的函数
//指针作为返回类型
func rpf() *int {
    //局部变量
    //函数内部使用简短运算符声明
    lv := 100
    // 返回lv的地址
    return &lv
}

输出:

n的值:  100

注意: Golang不提供对像C / C ++此类指针算法的任何支持。如果执行,则编译器将引发错误,认为是无效操作。

相关知识: Go中的ZeigerundZeigerübergabe an die Funktion