GO(5) - pointer

Go 跟 C 概念很類似,能透過 pointer 取得變數的 address。

變數的 address 相同,才能確保操作的對象。

另外 pass-by-address 的操作能減少對象被拷貝的次數,提高程式的效能。


1. 取得 address:

定義一個變數 a,並利用 pointer 取得 a 的 address。

func main() {
    a := 1
    ptr := &a
    fmt.Printf("Address of a is: %p\n", ptr)
}

用 * 號對 pointer 取值。

func main() {
    a := 1
    ptr := &a
    fmt.Printf("Address of a is: %p\n", ptr)

    val := *ptr
    fmt.Printf("The value of the pointer is: %d\n", val)
}

2. pass-by-value:

建立一個函式幫傳進來的變數+1。

func addOne(a int) {
    fmt.Printf("Address (addOne): %p\n", &a)
    a += 1
}

func main() {
    a := 1
    fmt.Printf("Address (main): %p\n", &a)
    addOne(a)

    fmt.Println("The value of a:", a) // 1
}

由 Printf 顯示兩個變數的 address 不同,所以被 +1 的對象不是 main() 裡面的 a 而是一個拷貝出來的對象。


3. pass-by-address:

這次傳入的對象為 a 的 address,由 Printf 卻認操作的是同一物件。

func addOne(ptr *int) {
    fmt.Printf("Address (addOne): %p\n", ptr)
    *ptr += 1
}

func main() {
    a := 1
    fmt.Printf("Address (main): %p\n", &a)
    addOne(&a)

    fmt.Println("The value of a:", a) // 2
}

我們由 address 取值可以確保被操作的對象為 main() 裡面的 a。

pass-by-address 能減少變數的拷貝並提高程式的效能,但要小心 side effect 的產生。

像 scala 的風格不喜歡函式中改動變數,所以會使用 immutable 來確保對象是不可變的。


留言

熱門文章