Go語言指針
在Go中指針是很容易學習的。一些進入編程任務,指針更容易操作,如通過引用調用,需要要使用指針來執行。所以學習指針成為完美Go程序員很有必要。讓我們開始學習指針的簡單和容易的步驟。
如你所知,每一個變量是一個內存位置,每個存儲單元都有其定義的地址,可以用符號(&)運算符,它表示一個內存地址進行訪問。考慮下麵的例子,這將打印中定義的變量的地址。
package main import "fmt" func main() { var a int = 10 fmt.Printf("Address of a variable: %x\n", &a ) }
當上述代碼被編譯和執行時,它會產生導致一些如下:
Address of a variable: 10328000
所以,明白了什麼是內存地址以及如何訪問它,所以這個概念的基礎上。現在,讓我們來看看什麼是指針。
什麼是指針?
指針是一個變量,其值是另一個變量的地址,所述存儲器位置,即,直接地址。就像變量或常量,必須聲明指針之前,可以用它來存儲任何變量的地址。指針變量聲明的一般形式是:
var var_name *var-type
在這裡,type為指針的基本類型;它必須是一個有效的Go數據類型,var-name是指針變量的名稱。 * 用來聲明指針使用星號。然而,在該語句中的星號被用來指定一個變量作為一個指針。以下是有效的指針聲明:
var ip *int /* pointer to an integer */ var fp *float32 /* pointer to a float */
所有指針值的實際數據類型,無論是整數,浮點或以其他方式,都是相同的,代表一存儲器地址的長十六進製數。不同數據類型的指針之間的唯一區彆是變量的數據類型或常數,由該指針指向。
如何使用指針?
有一些重要的操作,我們使用指針非常頻繁。 (a)定義一個指針變量(b)分配一個變量的指針;(c)在指針變量的地址,可用地址來訪問它的值。這可通過使用一元運算符 * ,返回位於其操作數所指定的地址的變量的值。下麵的例子利用這些操作:
package main import "fmt" func main() { var a int= 20 /* actual variable declaration */ var ip *int /* pointer variable declaration */ ip = &a /* store address of a in pointer variable*/ fmt.Printf("Address of a variable: %x\n", &a ) /* address stored in pointer variable */ fmt.Printf("Address stored in ip variable: %x\n", ip ) /* access the value using the pointer */ fmt.Printf("Value of *ip variable: %d\n", *ip ) }
當上述代碼被編譯和執行時,它會產生一些如下:
Address of var variable: 10328000 Address stored in ip variable: 10328000 Value of *ip variable: 20
在Go中的nil指針
Go語言編譯一個 nil 值賦給一個冇有被確切的地址分配的指針變量。這樣做是在變量聲明時,分配 nil 指針被稱為nil指針。
nil指針是一個常數為零在幾個標準庫中定義的值。考慮下麵的程序:
package main import "fmt" func main() { var ptr *int fmt.Printf("The value of ptr is : %x\n", ptr ) }
讓我們編譯和運行上麵的程序,這將產生以下結果:
The value of ptr is 0
在大多數操作係統中,程序不允許訪問存儲器的0地址,因為該存儲器是由操作係統保留。然而,存儲器地址0具有特彆重要的意義;它表明,該指針不指向一個訪問的存儲器位置。不過,按照慣例,如果一個指針包含nil(零)的值,則假定它指向一個什麼。
要檢查零(nil)指針,可以使用if語句如下:
if(ptr != nil) /* succeeds if p is not nil */ if(ptr == nil) /* succeeds if p is null */
Go語言指針詳情:
指針有很多,但是很容易的概念,在Go編程中非常重要。有以下幾個重要指針概念,作為一個Go程序員應該明確:
Concept | 描述 |
---|---|
Go -指針數組 | 可以定義數組持有一些指針 |
Go - 指針的指針 | 可以定義指針的指針 |
在Go中傳遞函數指針 | 通過引用或地址傳遞參數均使傳遞的參數將在調用函數被調用函數改變 |