詳解Go語言中指標的11個知識點

2022-10-27 22:01:38
指標是寫出優秀程式碼最重要的部分之一。在這篇文章中,我們將探索指標是什麼,以及如何在 Go 中使用它們。

php入門到就業線上直播課:進入學習
Apipost = Postman + Swagger + Mock + Jmeter 超好用的API偵錯工具:

1. 什麼是指標

指標是儲存其指向地址的變數(強調一下,只是儲存數值的變數)。【相關推薦:Go視訊教學

特定型別的指標只能指向該型別(指標指向的資料型別不可變)。

2. GoLang 指標語法

指標的語法非常簡單。以下是 Go 中指標宣告的語法。

var ptr *type
var ptrint *int     // 指向 int 的指標
登入後複製

指標的零值是 nil

3. Go 中指標的初始化

型別的指標使用 & 對其進行初始化:

package main

import (
    "fmt"
)

func main() {
    var q int = 42
    var p *int     // declare the pointer
    p = &q         // initialize the pointer
    fmt.Println(p)  // 0x40e020
}
登入後複製

4. Go 指標取值

指標取值意味著獲取指標儲存的地址內的值。下面是使用 * 運運算元執行指標取值操作的範例:

package main

import (
    "fmt"
)

func main() {
    var q int = 42
    var p *int
    p = &q
    fmt.Println(p)  // 0x40e020
    fmt.Println(*p) // 42
}
登入後複製

5. GoLang 中指標的指標

指標的地址為一個數值,此數值也可以被賦值給其他變數。因此,我們可以建立間接級別。這些間接級別有時會產生不必要的混淆,所以請謹慎使用。

package main

import (
    "fmt"
)

func main() {   
    i := 64
    j := &i  // j 是 int 型別的指標
    k := &j  // k 是存放指標地址的指標,也是 int 型別

    fmt.Println(i)  // 64

    fmt.Println(j)  // 0x40e020 

    fmt.Println(*j) // 64 (value inside that address)

    fmt.Println(k)  // 0x40c138

    fmt.Println(*k) // 0x40e020 (address of j)
}
登入後複製

6. 指向介面的指標

指標可以指向任何東西,甚至可以指向介面。當使用空介面時,返回的值為 nil

package main

import (
    "fmt"
)

func main() {   
    var a interface{}
    b := &a
    fmt.Println(b)    // 0x40c138
    fmt.Println(*b)   // <nil>
}
登入後複製

下面是一個使用帶有指標介面的例子。

package main

import (
    "fmt"
)

// 定義介面
type Bird interface{
    fly()
}

type B struct{
    name string
}

// 實現它
func (b B)fly() {
    fmt.Println("Flying...")
}

func main() {   
    var a Bird = B{"Peacock"}
    b := &a
    fmt.Println(b)    // 0x40c138
    fmt.Println(*b)   // {Peacock}
}
登入後複製

這裡 「a」 是一個 struct 型別的 Bird,然後用於介面型別,如您所見。這就是多型的使用。Go 允許使用 介面來實現多型. 因此,您可以看到指向結構或介面的指標是 Go 中必不可少的工具。

7. 指標作為函數引數

指標可以在 函數 中作為引數使用。與直接使用值相比,它有一些優勢。使用指標作為引數是將大物件傳遞給函數的一種非常有效的方式。因此,使用它是一個巨大的優化。

package main

import (
    "fmt"
)

//宣告指標引數
func f(a *int) {
    fmt.Println(*a)
}

func main() {   
    var a int = 42

    // 傳遞地址
    f(&a) // 42
}
登入後複製

使用大型物件可以減緩執行時間,這是將指標傳遞給結構體的範例。這是處理大物件的有效方法。

package main

import (
    "fmt"
)

type Human struct {
    name string
    age int
    place string
}

func f(h *Human) {
    fmt.Println("The user", (*h).name, "is", (*h).age, "years old and he is from", (*h).place)
}

func main() {   
    john := Human{"John", 36, "Las Vegas"}

    f(&john) // The user John is 36 years old and he is from Las Vegas
}
登入後複製

取消參照結構時要小心。如果您使用它像 *structname.field1 那麼它會丟擲錯誤。 正確的方法是 (*structname).field1

在函數內部使用指標會使值「可變」,除非它的引數為 const,因此,每當我們想要更改一個值時,我們應該使用指向該值的指標作為函數引數,然後進行必要的修改。

8. Go 中的「new」函數

Go 中的 new 函數返回一個指向型別的指標。

package main

import (
    "fmt"
)

func main() {   
    ptri := new(int)
    *ptri = 67

    fmt.Println(ptri)  // 0x40e020
    fmt.Println(*ptri) // 67
}
登入後複製

9. 從函數返回指標

可以像其他值一樣從函數返回任何型別的指標。這真的很簡單。我們不直接返回值,而是返回該值的地址。

package main

import (
    "fmt"
)

func p() *int {  // 將返回型別指定為指標
    v := 101

    // 返回地址
    return &v
}

func main() {   
    n := p()
    fmt.Println(n)  // 0x40e020
    fmt.Println(*n) // 101
}
登入後複製

10. 指向函數的指標

指向函數的指標在 Go 中是隱式工作的。這意味著我們不需要將其宣告為指標。

package main

import (
    "fmt"
)

func main() {       
    f := func() {
        fmt.Println("a function")   
    }
    pf := f
    pf() // 一個函數
}
登入後複製

11. Go 中使用指標要記住的事項

Go 中不允許進行指標運算。因此,我們不能像在 C/C++ 中那樣執行一元遞增或遞減之類的操作。
我們可能希望使用指向陣列的指標,但是使用切片是一個更好的選擇。切片比指向陣列的指標用途廣泛得多。程式碼非常簡潔,讓我們的工作更加容易。因此,儘可能使用切片。

更多程式設計相關知識,請存取:!!

以上就是詳解Go語言中指標的11個知識點的詳細內容,更多請關注TW511.COM其它相關文章!