Go - 指標
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 是指標的基本型別;它必須是有效的 C 資料型別,而 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 中的空指標
如果你沒有要分配的確切地址,Go 編譯器會將空值分配給指標變數。這是在變數宣告時完成的。分配為 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(零)值,則假定它不指向任何內容。
要檢查空指標,可以使用 if 語句,如下所示:
if(ptr != nil) /* succeeds if p is not nil */ if(ptr == nil) /* succeeds if p is null */
Go 指標詳解
指標有很多但容易理解的概念,它們對 Go 程式設計非常重要。Go 程式設計師應該清楚指標的以下概念:
| 序號 | 概念與描述 |
|---|---|
| 1 |
Go - 指標陣列
你可以定義陣列來儲存多個指標。 |
| 2 |
Go - 指向指標的指標
Go 允許你擁有指向指標的指標,依此類推。 |
| 3 |
在 Go 中將指標傳遞給函式
按引用或按地址傳遞引數都使被呼叫函式能夠在呼叫函式中更改傳遞的引數。 |