有學過 C 語言的就會知道「指標」這的東西,用它宣告的變數指的是記憶體的位置,當然 Go 目標是取代 C / C++ 怎麼可能會沒有指標呢?
指標
讓我們來看看簡單的範例
func zero(x int) {
x = 0
}
func main() {
x := 5
zero(x)
fmt.Println(x) // x is still 5
}
這麼範例可以簡單的看出嘗試著用 zero 這個函式來更改 x 的值,但是 zero 函式裡面的 x=0 ,是區域變數的變更,這個變更不會帶到外面,所以 x 仍然會是 5 。
當然你可以用前面學到的函式,來回傳更改後的值。
package main
import "fmt"
func zero(x int) int {
x = 0
return x
}
func main() {
x := 5
x = zero(x)
fmt.Println(x) // x is 0
}
這樣子就變更了。
但是有更好的方法嗎?有的,就是使用 Pointer(指標),指標要怎麼使用呢?很簡單只要使用 「 * 」就可以囉~是不是很簡單阿,讓我們馬上來看看。
func zero(xPtr *int) {
*xPtr = 0
}
func main() {
x := 5
zero(&x)
fmt.Println(x) // x is 0
}
這樣子就可以用了耶,要注意的是 zero(&x),這邊有一個 「 & 」,這個很重要不可以忘記,如果沒有這個就找不到指標囉,這個再讀取的時候一定會用到。
另外我再說詳細一點給沒碰過的人看,所謂的指標就是指到記憶體位置,上面的例子函式內不是宣告了一個指標 xPtr 嗎?以這邊來看 x 帶進來後就會去看他的「記憶體位置」,然後我們再下面的 *xPtr = 0 更改了這個「記憶體位置」的「值」,所以回到外面印出的時候就已經是 0 了,因為記憶體位置上的值已經被更改囉!