這是本golang系列教程的第十五篇。
指標是儲存乙個變數的記憶體位址的變數。
在上圖中,變數b
的值是156
,儲存在位址為0x1040a124
的記憶體中。變數a
儲存了變數b
的位址。現在可以說a
指向b
。
指向型別t
的指標用*t
表示。
讓我們寫一些**。
package main
import (
"fmt"
)func main()
&
操作符用來獲取乙個變數的位址。在上面的程式中,第 9 行我們將b
的位址賦給a
(a
的型別為*int
)。現在我們說a
指向了b
。當我們列印a
的值時,b
的位址將會被列印出來。程式的輸出為:
type
of a is *int
address of b is
0x1040a124
你可能得到的是乙個不同的b
的位址,因為b
可以在記憶體中的任何地方。
指標的空值為 nil 。
package main
import (
"fmt"
)func main()
}
在上面的程式中,b
的初始值為 nil。接著將a
的位址賦值給b
。程式的輸出為:
b is
b after initialisation is
0x1040a124
解引用指標的意思是通過指標訪問被指向的值。指標a
的解引用表示為:*a
。
讓我們通過乙個程式看一下它是怎麼工作的。
package
main
import (
"fmt"
)func
main()
上面程式的第10行,我們將a
解引用並列印這個解引用得到的值。和我們預期的一樣,程式列印的是b
的值。程式的輸出為:
address of b is
0x1040a124
value of b is
255
讓我們再寫乙個程式,該程式使用指標改變b
的值。
package main
import (
"fmt"
)func main()
在上面的程式中,我們將a
指向的值自增 1,這樣做也改變了b
的值,因為a
指向b
。因此b
的值變為256
。程式的輸出為:
address of b is
0x1040a124
value of b is
255new value of b is
256
package main
import (
"fmt"
)func change(val *int)
func main()
在上面的程式中,第 14 行,我們將指向a
的指標b
傳遞給函式change
。在函式change
內部,第 8 行,通過解引用修改了a
的值。程式的輸出如下:
valueofa
before
function
call
is58
valueofa
after
function
call
is55
假設我們需要通過函式修改乙個陣列。乙個辦法是將陣列的指標作為引數傳遞給函式。
package main
import (
"fmt"
)func modify(arr *[3]int)
func main()
modify(&a)
fmt.println(a)
}
在上面的程式中,第13行,陣列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
import (
"fmt"
)func modify(sls int)
func main()
modify(a[:])
fmt.println(a)
}
在上面的程式中,第13行,我們傳遞了乙個切片給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入門教程(十五)指標
指標是乙個變數,用於儲存另乙個變數的記憶體位址。在上面的例子中,變數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 運算子用於獲取變數的位址。在...
Golang教程 指標
指標是儲存乙個變數的記憶體位址的變數。在上圖中,變數b的值是156,儲存在位址為0x1040a124的記憶體中。變數a儲存了變數b的位址。現在可以說a指向b。乙個指標變數指向了乙個值的記憶體位址。類似於變數和常量,在使用指標前你需要宣告指標。指標宣告格式如下 var var name var typ...