Golang 函数返回指针

Golang 函数返回指针

前提是。Go中的指针和向函数传递指针

Go编程语言或Golang中的指针是一个变量,用来存储另一个变量的内存地址。我们可以向函数传递指针,也可以从Golang中的函数返回指针。在C/C++中,不建议在函数外返回一个局部变量的地址,因为它在函数返回后会超出范围。所以要执行C/C++中从函数返回指针的概念,你必须将局部变量定义为静态变量。

例如: 在下面的程序中,一行代码( int lv = n1 * n1; )会产生警告,因为它是函数的局部变量。为了避免警告,请把它变成静态变量。

// C++ program to return the
// pointer from a function
#include <iostream>
using namespace std;
  
// taking a function having
// pointer as return type
int* rpf(int);
  
int main()
{
  
    int n = 745;
  
    // displaying the value of n
    cout << n << endl;
  
    // calling the function
    cout << *rpf(n) << endl;
}
  
// defining function
int* rpf(int n1)
{
  
    // taking a local variable
    // inside the function
    int lv = n1 * n1;
  
    // remove comment or make the above
    // declaration as static which
    // result into successful
    // compilation
    // static int lv = n1 * n1;
  
    // this will give warning as we
    // are returning the address of
    // the local variable
    return &lv
}

警告

prog.cpp:在函数int* rpf(int)中:

prog.cpp:24:9: 警告:返回局部变量’lv’的地址 [-Wreturn-local-addr]
int lv = n1 * n1

输出

745

这种情况背后的主要原因是,编译器总是为一个函数调用建立一个堆栈。一旦函数退出,函数栈也会被移除,这就导致函数的局部变量超出了范围。将其静态化将解决这个问题。因为静态变量有一个特性,就是在它们退出范围后仍能保留其值。

但是 Go编译器是非常智能的! 它不会对内存进行分配。它不会将堆栈中的内存分配给函数的局部变量。它将在堆上分配这个变量。在下面的程序中,变量lv将被分配到堆上,因为Go编译器会进行转义分析,将变量从局部范围中转出。

例子

// Go program to return the
// pointer from the function
package main
  
import "fmt"
  
// main function
func main() {
  
    // calling the function
    n := rpf()
  
    // displaying the value
    fmt.Println("Value of n is: ", *n)
  
}
  
// defining function having integer
// pointer as return type
func rpf() *int {
  
    // taking a local variable
    // inside the function
    // using short declaration
    // operator
    lv := 100
  
    // returning the address of lv
    return &lv
}

输出

Value of n is:  100

注意: Golang并不像C/C++那样提供任何对指针运算的支持。如果你要执行的话,编译器会抛出一个无效操作的错误。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程