Golang教程 指標

2022-07-15 16:45:10 字數 3610 閱讀 5689

指標是儲存乙個變數的記憶體位址的變數。 

在上圖中,變數b的值是156,儲存在位址為0x1040a124的記憶體中。變數a儲存了變數b的位址。現在可以說a指向b

乙個指標變數指向了乙個值的記憶體位址。

類似於變數和常量,在使用指標前你需要宣告指標。指標宣告格式如下:

var var_name *var-type
var-type 為指標型別,var_name 為指標變數名,* 號用於指定變數是作為乙個指標。以下是有效的指標宣告:

var ip *int

/*指向整型

*/var fp *float32 /*

指向浮點型

*/

讓我們寫一些**。

package main

import (

"fmt")

func main()

&操作符用來獲取乙個變數的位址。在上面的程式中,第 9 行我們將b的位址賦給aa的型別為*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  

import (

"fmt")

func main()

上面程式的第10行,我們將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 is

0x1040a124

value of b

is255

new value of b is

256

package main

import (

"fmt")

func change(val *int

) func main()

在上面的程式中,第 14 行,我們將指向a的指標b傳遞給函式change。在函式change內部,第 8 行,通過解引用修改了a的值。程式的輸出如下:

value of a before function call is

58value of a 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教程 (十五)指標

這是本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 運算子用於獲取變數的位址。在...