91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Go語言中指針的知識點有哪些

發布時間:2022-10-28 09:41:53 來源:億速云 閱讀:163 作者:iii 欄目:編程語言

今天小編給大家分享一下Go語言中指針的知識點有哪些的相關知識點,內容詳細,邏輯清晰,相信大部分人都還太了解這方面的知識,所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。

1. 什么是指針

指針是存儲其指向地址的變量(強調一下,只是存儲數值的變量)。

特定類型的指針只能指向該類型(指針指向的數據類型不可變)。

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語言中指針的知識點有哪些”這篇文章的所有內容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學習更多的知識,請關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

锡林浩特市| 天全县| 盘锦市| 稻城县| 姜堰市| 砀山县| 门源| 阿克苏市| 攀枝花市| 康平县| 博野县| 岳西县| 内黄县| 宽城| 吐鲁番市| 宜丰县| 温州市| 新营市| 邛崃市| 石台县| 正镶白旗| 渑池县| 临桂县| 景东| 交城县| 松原市| 龙口市| 德江县| 西昌市| 河池市| 贺州市| 青岛市| 乌拉特中旗| 芷江| 美姑县| 咸宁市| 勃利县| 嘉定区| 乳源| 宜黄县| 民勤县|