指標是儲存乙個變數的記憶體位址的變數。
在上圖中,變數b
的值是156
,儲存在位址為0x1040a124
的記憶體中。變數a
儲存了變數b
的位址。現在可以說a
指向b
。
乙個指標變數指向了乙個值的記憶體位址。
類似於變數和常量,在使用指標前你需要宣告指標。指標宣告格式如下:
var var_name *var-typevar-type 為指標型別,var_name 為指標變數名,* 號用於指定變數是作為乙個指標。以下是有效的指標宣告:
var ip *int讓我們寫一些**。/*指向整型
*/var fp *float32 /*
指向浮點型
*/
package mainimport (
"fmt")
func main()
&
操作符用來獲取乙個變數的位址。在上面的程式中,第 9 行我們將b
的位址賦給a
(a
的型別為*int
)。現在我們說a
指向了b
。當我們列印a
的值時,b
的位址將會被列印出來。程式的輸出為:
type of a is *int你可能得到的是乙個不同的address of b
is0x1040a124
b
的位址,因為b
可以在記憶體中的任何地方
指標的空值為 nil 。
package main在上面的程式中,import (
"fmt")
func main()
}
b
的初始值為 nil。接著將a
的位址賦值給b
。程式的輸出為:
b is解引用指標的意思是通過指標訪問被指向的值。指標b after initialisation
is0x1040a124
a
的解引用表示為:*a
。
讓我們通過乙個程式看一下它是怎麼工作的。
package main上面程式的第10行,我們將import (
"fmt")
func main()
a
解引用並列印這個解引用得到的值。和我們預期的一樣,程式列印的是b
的值。程式的輸出為:
address of b is讓我們再寫乙個程式,該程式使用指標改變0x1040a124
value of b
is255
b
的值。
package main在上面的程式中,我們將import (
"fmt")
func main()
a
指向的值自增 1,這樣做也改變了b
的值,因為a
指向b
。因此b
的值變為256
。程式的輸出為:
address of b is0x1040a124
value of b
is255
new value of b is
256
package main在上面的程式中,第 14 行,我們將指向import (
"fmt")
func change(val *int
) func main()
a
的指標b
傳遞給函式change
。在函式change
內部,第 8 行,通過解引用修改了a
的值。程式的輸出如下:
value of a before function call is假設我們需要通過函式修改乙個陣列。乙個辦法是將陣列的指標作為引數傳遞給函式。58value of a after function call
is55
package main在上面的程式中,第13行,陣列import (
"fmt")
func modify(arr *[3]int
) func main()
modify(&a)
fmt.println(a)
}
a
的位址傳遞給了函式modify
。在第8行的modify
函式中,我們通過解引用的方式將陣列的第乙個元素賦值為90
。程式輸出為:[90 90 91]
。
a[x] 是 (*a)[x] 的簡寫,因此上面的程式中,(*arr)[0] 可以替換為 arr[0]。讓我們用這種簡寫方式重寫上面的程式:
package main程式的輸出依然是:import (
"fmt")
func modify(arr *[3]int
) func main()
modify(&a)
fmt.println(a)
}
[90 90 91]
。
雖然可以通過傳遞陣列指標給函式的方式來修改原始陣列的值,但這在 go 中不是慣用的方式,我們可以使用切片完成同樣的事情。
讓我們用切片的方式重寫上面的程式:
package main在上面的程式中,第13行,我們傳遞了乙個切片給import (
"fmt")
func modify(sls
int)
func main()
modify(a[:])
fmt.println(a)
}
modify
函式。在函式內部,切片的第乙個元素被修改為90
。程式的輸出為:[90 90 91]
。所以請不要以陣列指標作為引數傳遞給函式,而是使用切片:)。這樣的**更加簡潔,在 go 中更常被使用。
go 不支援其他語言(比如c)中的指標運算。
package main上面的程式將報錯:func main()
p := &b
p++}
main.go:6: invalid operation: p++ (non-numeric type *[3]int)
Golang教程 (十五)指標
這是本golang系列教程的第十五篇。指標是儲存乙個變數的記憶體位址的變數。在上圖中,變數b的值是156,儲存在位址為0x1040a124的記憶體中。變數a儲存了變數b的位址。現在可以說a指向b。指向型別t的指標用 t表示。讓我們寫一些 package main import fmt func ma...
Golang入門教程(十五)指標
指標是乙個變數,用於儲存另乙個變數的記憶體位址。在上面的例子中,變數b的值是156,儲存在記憶體位址0x1040a124。變數a包含b的位址。可以說現在a指向b。指向型別t的指標用 t表示 讓我們寫一些 package main import fmt func main 運算子用於獲取變數的位址。在...
Golang入門教程(十五)指標
指標是乙個變數,用於儲存另乙個變數的記憶體位址。在上面的例子中,變數b的值是156,儲存在記憶體位址0x1040a124。變數a包含b的位址。可以說現在a指向b。指向型別t的指標用 t表示 讓我們寫一些 package main import fmt func main 運算子用於獲取變數的位址。在...