溫馨提示×

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

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Go語(yǔ)言中指針的知識(shí)點(diǎn)有哪些

發(fā)布時(shí)間:2022-10-28 09:41:53 來源:億速云 閱讀:161 作者:iii 欄目:編程語(yǔ)言

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

1. 什么是指針

指針是存儲(chǔ)其指向地址的變量(強(qiáng)調(diào)一下,只是存儲(chǔ)數(shù)值的變量)。

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

2. GoLang 指針語(yǔ)法

指針的語(yǔ)法非常簡(jiǎn)單。以下是 Go 中指針聲明的語(yǔ)法。

var ptr *type
var ptrint *int     // 指向 int 的指針

指針的零值是 nil

3. Go 中指針的初始化

類型的指針使用 & 對(duì)其進(jìn)行初始化:

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

指針取值意味著獲取指針保存的地址內(nèi)的值。下面是使用 * 運(yùn)算符執(zhí)行指針取值操作的示例:

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

指針的地址為一個(gè)數(shù)值,此數(shù)值也可以被賦值給其他變量。因此,我們可以創(chuàng)建間接級(jí)別。這些間接級(jí)別有時(shí)會(huì)產(chǎn)生不必要的混淆,所以請(qǐng)謹(jǐn)慎使用。

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. 指向接口的指針

指針可以指向任何東西,甚至可以指向接口。當(dāng)使用空接口時(shí),返回的值為 nil

package main

import (
   "fmt"
)

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

下面是一個(gè)使用帶有指針接口的例子。

package main

import (
   "fmt"
)

// 定義接口
type Bird interface{
   fly()
}

type B struct{
   name string
}

// 實(shí)現(xiàn)它
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” 是一個(gè) struct 類型的 Bird,然后用于接口類型,如您所見。這就是多態(tài)的使用。Go 允許使用 接口來實(shí)現(xiàn)多態(tài). 因此,您可以看到指向結(jié)構(gòu)或接口的指針是 Go 中必不可少的工具。

7. 指針作為函數(shù)參數(shù)

指針可以在 函數(shù)  中作為參數(shù)使用。與直接使用值相比,它有一些優(yōu)勢(shì)。使用指針作為參數(shù)是將大對(duì)象傳遞給函數(shù)的一種非常有效的方式。因此,使用它是一個(gè)巨大的優(yōu)化。

package main

import (
   "fmt"
)

//聲明指針參數(shù)
func f(a *int) {
   fmt.Println(*a)
}

func main() {  
   var a int = 42

   // 傳遞地址
   f(&a) // 42
}

使用大型對(duì)象可以減緩執(zhí)行時(shí)間,這是將指針傳遞給結(jié)構(gòu)體的示例。這是處理大對(duì)象的有效方法。

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
}

取消引用結(jié)構(gòu)時(shí)要小心。如果您使用它像 *structname.field1 那么它會(huì)拋出錯(cuò)誤。 正確的方法是 (*structname).field1。

在函數(shù)內(nèi)部使用指針會(huì)使值「可變」,除非它的參數(shù)為 const,因此,每當(dāng)我們想要更改一個(gè)值時(shí),我們應(yīng)該使用指向該值的指針作為函數(shù)參數(shù),然后進(jìn)行必要的修改。

8. Go 中的「new」函數(shù)

Go 中的 new 函數(shù)返回一個(gè)指向類型的指針。

package main

import (
   "fmt"
)

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

   fmt.Println(ptri)  // 0x40e020
   fmt.Println(*ptri) // 67
}

9. 從函數(shù)返回指針

可以像其他值一樣從函數(shù)返回任何類型的指針。這真的很簡(jiǎn)單。我們不直接返回值,而是返回該值的地址。

package main

import (
   "fmt"
)

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

   // 返回地址
   return &v
}

func main() {  
   n := p()
   fmt.Println(n)  // 0x40e020
   fmt.Println(*n) // 101
}

10. 指向函數(shù)的指針

指向函數(shù)的指針在 Go 中是隱式工作的。這意味著我們不需要將其聲明為指針。

package main

import (
   "fmt"
)

func main() {      
   f := func() {
       fmt.Println("a function")  
   }
   pf := f
   pf() // 一個(gè)函數(shù)
}

11. Go 中使用指針要記住的事項(xiàng)

Go 中不允許進(jìn)行指針運(yùn)算。因此,我們不能像在 C/C++ 中那樣執(zhí)行一元遞增或遞減之類的操作。
我們可能希望使用指向數(shù)組的指針,但是使用切片是一個(gè)更好的選擇。切片比指向數(shù)組的指針用途廣泛得多。代碼非常簡(jiǎn)潔,讓我們的工作更加容易。因此,盡可能使用切片。

以上就是“Go語(yǔ)言中指針的知識(shí)點(diǎn)有哪些”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會(huì)為大家更新不同的知識(shí),如果還想學(xué)習(xí)更多的知識(shí),請(qǐng)關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI