網頁

2021/6/12

Golang Pointers 指標簡單範例

Go語言的pointer(指標)簡單範例。


有學過C或C++程式對指標會非常熟悉,而Go的pointer概念一樣,是指向記憶體位置的變數。如果學過Java物件參照的概念也可以輕易地理解什麼是pointer。

Go使用星號*(asterisk)宣告一個指向型態為intpointer 變數p。由於p尚未指向任何變數的記憶體位址,所以值為nil

package main

import "fmt"

func main() {
    var p *int // 宣告變數p為指向int型態的pointer
    fmt.Println(p) // <nil>
}

在變數前加上&(ampersand)符號即可取得該變數的記憶體位置,例如下面取得變數i的指標為p並印出記憶體位址。

package main

import "fmt"

func main() {
    var p *int
    fmt.Println(p) // <nil>

    i := 12 // 宣告變數i及賦值12
    p = &i // 在變數i前加上'&'取得指向i記憶體位址的pointer放入p
    fmt.Println(p) // 0xc00011a008
}

在pointer變數前加上*代表所指向的變數。

package main

import "fmt"

func main() {
    var p *int
    fmt.Println(p) // <nil>

    i := 12 // 宣告變數i及賦值12
    p = &i // 在變數i前加上'&'取得指向i記憶體位址的pointer放入p
    fmt.Println(p) // 0xc00011a008

    fmt.Println(*p) // 12, 在pointer p前加上'*'代表指向的變數i
    *p = 34 // 把p指向的變數i設為34
    fmt.Println(i) // 34
}

參考「Golang Pointer符號整理」。

另一個範例。

package main

import "fmt"

func main() {
    message := "hello world" // 宣告字串變數message值為"hello world"
    fmt.Println(message) // hello world

    p := &message // 在變數message前使用'&'取得指向記憶體位址的pointer並設為p

    fmt.Println(p) // 印出pointer p指向的記憶體位址,這邊為0xc000010240
    fmt.Println(*p) // 在pointer p前加上'*'印出pointer p指向的變數值,即"hello world"

    *p = "hello go pointers" // 在pointer p前加上'*'設定指向變數message的值為"hello go pointers"
    fmt.Println(message) // hello go pointers
}

pointer只能取得同型態變數的記憶體位址。例如下面取得字串變數message放入int型態的pointer p時會發生錯誤。

package main

import "fmt"

func main() {
    var p *int
    message := "hello world" // 宣告字串變數message值為"hello world"
    
    p = &message // 錯誤,cannot use &message (type *string) as type *int in assignment

    fmt.Println(*p)
}


沒有留言:

張貼留言