Golang 菜鳥教程

Golang 控制語句

Golang 函數 & 方法

Golang 結構體

Golang 切片 & 數組

Golang 字符串(String)

Golang 指針

Golang 接口

Golang 并發(fā)

Golang 異常(Error)

Golang 其他雜項

Go 語言函數返回指針

Golang編程語言中的指針是一個變量,用于存儲另一個變量的內存地址。我們可以將指針傳遞給函數,也可以從Golang中的函數返回指針。在C/ c++中,不建議在函數之外返回局部變量的地址,因為它在函數返回后超出了作用域。因此,要在C/ c++中執(zhí)行從函數返回指針,必須將局部變量定義為靜態(tài)變量。

示例:讓我先來看個C++示例,在下面的程序中,代碼行(int lv = n1 * n1;)將發(fā)出警告,因為它是該函數的本地代碼。 為避免警告,請將其設置為靜態(tài)變量。

// 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

這種情況下的主要原因是編譯器始終為函數調用生成堆棧。一旦函數退出,函數堆棧也會被刪除,這會導致函數的局部變量超出范圍。將其設置為靜態(tài)將解決該問題。由于靜態(tài)變量具有保留其值的屬性,即使它們超出其范圍也是如此。

但是Go編譯器非常智能!。它不會將堆棧上的內存分配給該函數的局部變量。它將在堆上分配此變量。在下面的程序中,變量lv將在堆上分配內存,因為Go編譯器將執(zhí)行轉義分析以從本地范圍轉義變量。

//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 ++這樣的指針算法的任何支持。如果執(zhí)行,則編譯器將引發(fā)錯誤,認為是無效操作。

相關知識: Go中的指針和將指針傳遞給函數

丰满人妻一级特黄a大片,午夜无码免费福利一级,欧美亚洲精品在线,国产婷婷成人久久Av免费高清