亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

本文主要介紹 Go 語言中的指針。Go 語言中和 C/C++ 一樣,直接提供了指針類型,但是不同的是 Go 語言的指針并沒有那么高深莫測,因為它是無法進行位移和運算的,它只是一個存儲了其它變量地址的變量而已。它在 Go 語言中最大的作用就是在值傳遞的過程中減少內存消耗,畢竟一個地址的存儲開銷是十分少的。

1. 指針的定義和使用

在 Go 語言中指針類型的聲明和 C/C++ 類似,都是采用 * 符號來區分正常類型變量和指針變量。

代碼示例

package main

import (
    "fmt"
)

func main() {
    str := "Hello World !"
    var strP *string
    strP = &str
    *strP = "Hello Codey !"
    fmt.Println("指針strP的地址為", strP)
    fmt.Println("指針strP指向的值為", *strP)
    fmt.Println("變量str的地址為", &str)
    fmt.Println("變量str的值為", str)
}
  • 第 9 行:使用 *+變量類型的形式聲明一個 string 類型的指針。
  • 第 10 行:將指針 strP 指向變量 str,也就是將變量 str 的地址賦值給指針變量 strP 。& 為取地址符,可以取出變量所在的地址。
  • 第 11 行:通過指針修改 str 的值。

執行結果

圖片描述

從以上輸出結果可以看出,變量 strP 存儲的值就是變量 str 的地址,可以通過使用 *strP 操作符改變其存儲的地址所存儲的值。

2. 指針作為函數的參數

Go 語言中只有值傳遞,沒有引用傳遞,因為引用傳遞設計之初是為了解決函數想要有多個返回值的問題,但是 Go 語言的函數自帶多返回值的返回方式。所以想要指針作為參數傳入函數中,只能傳遞地址進入函數進行修改,并不能直接引用指針參數,這一特點就大大降低了 Go 語言指針的使用難度。

代碼示例

package main

import (
    "fmt"
)

func main() {
    a := 10
    b := 20
    fmt.Println("交換前的a=", a, "b=", b)
    swap(&a, &b)
    fmt.Println("交換后的a=", a, "b=", b)
}

func swap(a, b *int) {
    *a, *b = *b, *a
}
  • 第 11 行:將變量 a 和 b 的地址作為函數 swap 指針參數的值傳入函數;
  • 第 16 行:交換這兩個指針保存的地址所保存的值。

執行結果

圖片描述

3. 小結

本文主要講解了 Go 語言中指針的使用,以下為注意事項:

  • Go 語言的指針不可以做偏移
  • Go 語言的指針可以看作一個存儲地址的特殊變量類型。