首頁 > 後端開發 > Golang > 詳解Go語言中指針的11個知識點

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

青灯夜游
發布: 2022-10-27 19:19:09
轉載
3177 人瀏覽過

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

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

1. 什麼是指標

#指標是儲存其指向位址的變數(強調一下,只是儲存數值的變數)。 【相關建議:Go影片教學

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

2. GoLang 指標語法

指標的語法非常簡單。以下是 Go 中指標聲明的語法。

1

2

var ptr *type

var ptrint *int     // 指向 int 的指针

登入後複製

#指標的零值是 nil

3. Go 中指標的初始化

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

1

2

3

4

5

6

7

8

9

10

11

12

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 指標取值

指標取值表示取得指標所保存的位址內的值。以下是使用* 運算子執行指標取值運算的範例:

1

2

3

4

5

6

7

8

9

10

11

12

13

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 中指標的指標

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

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

1

2

3

4

5

6

7

8

9

10

11

12

package main

 

import (

    "fmt"

)

 

func main() {  

    var a interface{}

    b := &a

    fmt.Println(b)    // 0x40c138

    fmt.Println(*b)   // <nil>

}

登入後複製

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

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.指標作為函數參數

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

package main

 

import (

    "fmt"

)

 

//声明指针参数

func f(a *int) {

    fmt.Println(*a)

}

 

func main() {  

    var a int = 42

 

    // 传递地址

    f(&a) // 42

}

登入後複製

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

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 函數傳回一個指向類型的指標。

1

2

3

4

5

6

7

8

9

10

11

12

13

package main

 

import (

    "fmt"

)

 

func main() {  

    ptri := new(int)

    *ptri = 67

 

    fmt.Println(ptri)  // 0x40e020

    fmt.Println(*ptri) // 67

}

登入後複製

9. 從函數傳回指標

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

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 中是隱式工作的。這意味著我們不需要將其聲明為指標。

1

2

3

4

5

6

7

8

9

10

11

12

13

package main

 

import (

    "fmt"

)

 

func main() {      

    f := func() {

        fmt.Println("a function")  

    }

    pf := f

    pf() // 一个函数

}

登入後複製

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

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

更多程式相關知識,請造訪:程式設計影片! !

以上是詳解Go語言中指針的11個知識點的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:learnku.com
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
最新問題
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板