Go中的指針是很容易學(xué)習(xí),也是比較有趣的。一些Go編程任務(wù)使用指針更容易執(zhí)行,并且不使用指針不能執(zhí)行其他任務(wù),例如通過引用調(diào)用。 因此,有必要學(xué)習(xí)指針,成為一個(gè)完美的Go程序員?,F(xiàn)在我們開始通過簡單和容易的步驟來學(xué)習(xí)Go編程中的指針。
如眾所知,每個(gè)變量都是一個(gè)內(nèi)存位置,每個(gè)內(nèi)存位置都有其定義的地址,可以使用”和”號(hào)(&)運(yùn)算符來訪問它,這個(gè)運(yùn)算符表示內(nèi)存中的地址。參考下面的例子,它將打印定義的變量的地址:
package main
import "fmt"
func main() {
var a int = 10
fmt.Printf("Address of a variable: %x\n", &a )
}
當(dāng)上面的代碼被編譯和執(zhí)行時(shí),它產(chǎn)生結(jié)果如下:
Address of a variable: 10328000
所以要明白什么是內(nèi)存地址,以及如何訪問它,基礎(chǔ)的概念講到這里就結(jié)束了。現(xiàn)在讓我們看看什么是指針。
指針是一個(gè)變量,其值是另一個(gè)變量的地址,即存儲(chǔ)器位置的直接地址。類似變量或常量一樣,必須要先聲明一個(gè)指針,然后才能使用它來存儲(chǔ)任何變量地址。指針變量聲明的一般形式是:
var var-name *var-type
這里,var-type是指針的基類型; 它必須是有效的Go數(shù)據(jù)類型,var-name是指針變量的名稱。用于聲明指針的星號(hào)(*)與用于乘法的星號(hào)相同。但是,在此語句中,星號(hào)(*)用于將變量指定為指針。以下是有效的指針聲明:
var ip *int /* pointer to an integer */
var fp *float32 /* pointer to a float */
所有指針的值的實(shí)際數(shù)據(jù)類型(無論是整數(shù),浮點(diǎn)數(shù)還是其他數(shù)據(jù)類型)都是相同的,它表示內(nèi)存地址的長十六進(jìn)制數(shù)。不同數(shù)據(jù)類型的指針的唯一區(qū)別是指針?biāo)赶虻氖亲兞炕虺A康臄?shù)據(jù)類型。
有幾個(gè)重要的操作,將非常頻繁地使用指針來實(shí)現(xiàn)。
這是通過使用一元運(yùn)算符*來返回位于操作數(shù)指定的地址的變量的值。下面的例子使用這些操作:
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 )
}
當(dāng)上面的代碼編譯和執(zhí)行時(shí),它產(chǎn)生結(jié)果如下:
Address of var variable: 10328000
Address stored in ip variable: 10328000
Value of *ip variable: 20
Go編譯器為指針變量分配一個(gè)Nil值,以防指針沒有確切的地址分配。這是在變量聲明的時(shí)候完成的。指定為nil值的指針稱為nil指針。
nil指針是在幾個(gè)標(biāo)準(zhǔn)庫中定義的值為零的常量。參考下面的程序:
package main
import "fmt"
func main() {
var ptr *int
fmt.Printf("The value of ptr is : %x\n", ptr )
}
當(dāng)上面的代碼編譯和執(zhí)行時(shí),它產(chǎn)生結(jié)果如下:
The value of ptr is 0
在大多數(shù)操作系統(tǒng)上,程序不允許訪問地址0處的內(nèi)存,因?yàn)樵搩?nèi)存是由操作系統(tǒng)保留的。 然而,存儲(chǔ)器地址0具有特殊意義; 它表示指針不打算指向可訪問的存儲(chǔ)器位置。但是按照慣例,如果指針包含nil(零)值,則假設(shè)它不指向任何東西。
要檢查是否為nil指針,可以使用if語句,如下所示:
if(ptr != nil) /* succeeds if p is not nil */
if(ptr == nil) /* succeeds if p is null */
指針有很多但很簡單的概念,它們對Go編程非常重要。下面幾個(gè)重要的指針概念,對于Go程序員應(yīng)該要清楚:
| 概念 | 描述 |
|---|---|
| Go指針數(shù)組 | 可以定義數(shù)組來保存一些指針 |
| Go指針的指針 | Go允許有指針指向指針等等 |
| 傳遞指針到函數(shù) | 通過引用或地址傳遞參數(shù)都允許被調(diào)用函數(shù)在調(diào)用函數(shù)中更改傳遞的參數(shù)。 |