最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Golang指針隱式間接引用詳解

 更新時間:2023年05月16日 08:39:54   作者:人艱不拆_zmc  
在 Go中,指針隱式解引用是指通過指針直接訪問指針?biāo)赶虻闹?,而不需要顯式地使用 * 運算符來解引用指針,這篇文章主要介紹了Golang指針隱式間接引用,需要的朋友可以參考下

1、Golang指針

在介紹Golang指針隱式間接引用前,先簡單說下Go 語言的指針 (Pointer),一個指針可以指向任何一個值的內(nèi)存地址 它指向那個值的內(nèi)存地址,在 32 位機器上占用 4 個字節(jié),在 64 位機器上占用 8 個字節(jié),并且與它所指向的值的大小無關(guān)。大致上理解如下:

  • 變量名前的 & 符號,是取變量的內(nèi)存地址,不是取值;
  • 數(shù)據(jù)類型前的 * 符號,代表要儲存的是對應(yīng)數(shù)據(jù)類型的內(nèi)存地址,不是存值;
  • 變量名前的 * 符號,代表從內(nèi)存地址中取值 (Dereferencing)。

使用一個指針引用一個值被稱為間接引用。

注意 1:golang 指針Dereferencing(解引用)是什么意思?

在 Go 語言中,指針解引用(dereferencing)是指通過指針訪問指針?biāo)赶虻膬?nèi)存地址上存儲的值。在指針變量前加上 * 符號可以進(jìn)行指針解引用操作。指針解引用會返回指針?biāo)赶虻膬?nèi)存地址上存儲的值。例如,假設(shè)有一個指向int類型變量的指針:

var x int = 42
var p *int = &x

要訪問p指針指向的值,可以使用指針解引用:

fmt.Println(*p) // 輸出:42

可以看到,使用操作符訪問指針指向的值時,需要將其放置在指針變量的前面。如果嘗試使用操作符訪問一個空指針,會引發(fā)運行時錯誤。因此,在解引用指針之前,通常需要確保指針不是空指針。

注意 2:在Go語言中,直接砍掉了 C 語言指針最復(fù)雜的指針運算部分,只留下了獲取指針(&運算符)和獲取對象(*運算符)的運算,用法和C語言很類似。但不同的是,Go語言中沒有->操作符來調(diào)用指針?biāo)鶎俚某蓡T,而與一般對象一樣,都是使用.來調(diào)用。

注意 3:Go 語言中一個指針被定義后沒有分配到任何變量時,它的值為nil

2、new函數(shù)

在 Go 語言中,new 函數(shù)用于動態(tài)地分配內(nèi)存,返回一個指向新分配的零值的指針。它的語法如下:

func new(Type) *Type

其中,Type 表示要分配的內(nèi)存的類型,new 函數(shù)返回一個指向 Type 類型的新分配的零值的指針。但是需要注意的是,new 函數(shù)只分配內(nèi)存,并返回指向新分配的零值的指針,而不會初始化該內(nèi)存。

注意 1:用new(structName):這個方法得到的是*structName類型,即類的指針類型;用structName{init para}:這個方法得到的是structName類型,即類的實例類型,不是指針。

注意 2:new函數(shù)更多細(xì)節(jié)介紹請參見《Go語言new( )函數(shù)》這篇博文。

3、Golang指針隱式間接引用

Go 語言自帶指針隱式解引用 :對于一些復(fù)雜類型的指針, 如果要訪問成員變量時候需要寫成類似*p.field的形式時,只需要p.field即可訪問相應(yīng)的成員。以下復(fù)雜類型自帶指針隱式解引用:

3.1 結(jié)構(gòu)體類型指針隱式間接引用

結(jié)構(gòu)體字段可以通過結(jié)構(gòu)體指針來訪問。如果我們有一個指向結(jié)構(gòu)體的指針p,那么可以通過(*p).X來訪問其字段X。不過這么寫太啰嗦了,所以語言也允許我們使用隱式間接引用,直接寫p.X就可以。示例代碼如下:

package main
import (
    "fmt"
)
type Student struct {
    name   string
    age    int
    weight float32
    score  []int
}
func main(){
   pp := new(Student) //使用 new 關(guān)鍵字創(chuàng)建一個指針
   *pp = Student{"qishuangming", 23, 65.0, []int{2, 3, 6}}
   fmt.Printf("stu pp have %d subjects\n", len((*pp).score)) //按照我們對指針的了解,對Student結(jié)構(gòu)體對象pp顯示賦值的話需要使用解引用語法進(jìn)行賦值,但是實際編碼時都會省去*,寫法如下行所示。
   fmt.Printf("stu pp have %d subjects\n", len(pp.score)) //編譯器會自動將指針解引用,并訪問結(jié)構(gòu)體中的對應(yīng)字段,這個過程被稱為隱式間接引用。
}

3.2 數(shù)組類型指針隱式間接引用

同樣指向數(shù)組的指針可以隱式解引用數(shù)組中的元素。

var arr [3]int
p := &arr
p[0] = 1 // 等價于 (*p)[0] = 1

3.3 切片類型指針隱式間接引用

切片實際上是對底層數(shù)組的封裝,因此指向切片的指針可以隱式解引用切片中的元素。

s := []int{1, 2, 3}
p := &s
p[0] = 4 // 等價于 (*p)[0] = 4

3.4 字典類型隱式間接引用

map 是引用類型,當(dāng)我們使用 map 類型的變量訪問元素時,也不需要使用 * 運算符進(jìn)行解引用,Golang 會自動幫我們解引用。

m := map[string]int{"a": 1, "b": 2}
fmt.Println(m["a"]) // 隱式解引用

3.5func 類型隱式間接引用

在 Golang 中,函數(shù)類型也是一種類型,它可以使用指針類型來表示函數(shù)的地址。如果我們定義了一個函數(shù)類型的變量,并將一個函數(shù)的地址賦值給它,那么我們可以直接調(diào)用該變量,并且不需要使用 * 運算符進(jìn)行解引用。

例如,以下代碼演示了函數(shù)類型指針的隱式解引用:

type Add func(a, b int) int
func main() {
    var add Add
    add = func(a, b int) int {
        return a + b
    }
    println(add) //0x10cf168
    sum := add(1, 2) // 隱式解引用
    fmt.Println(sum)
}

在上面的代碼中,我們定義了一個函數(shù)類型 Add,它接受兩個 int 類型的參數(shù)并返回一個 int 類型的值。我們定義了一個變量 add,它的類型是 Add。我們將一個函數(shù)的地址賦值給了 add 變量,然后直接調(diào)用了 add 變量,不需要使用 * 運算符進(jìn)行解引用。

注意 1:函數(shù)類型指針的隱式解引用僅適用于函數(shù)類型變量的調(diào)用,而不適用于訪問函數(shù)類型變量的成員。如果我們想要訪問函數(shù)類型變量的成員,還是需要使用 * 運算符進(jìn)行解引用。

注意 2:在 Go 中,基本類型(如 int、float、bool 等)以及字符串類型等非引用類型都沒有指針隱式解引用的行為。這意味著,如果需要訪問基本類型的指針指向的值,必須顯式地使用 * 運算符來解引用指針。下面是一個示例:

var i int
p := &i
*p = 1 // 顯式解引用指針來修改指針?biāo)赶虻闹?
fmt.Println(i) // 輸出 1

另外,對于基本類型而言,使用指針可能會導(dǎo)致性能下降。因此,在使用指針時應(yīng)該謹(jǐn)慎,并且只在必要的情況下使用指針來傳遞數(shù)據(jù)?! ?/p>

4、總結(jié)

在 Go 中,指針隱式解引用是指通過指針直接訪問指針?biāo)赶虻闹?,而不需要顯式地使用 * 運算符來解引用指針。對于一些復(fù)雜類型的指針(結(jié)構(gòu)體類型指針、數(shù)組/切片類型指針、字典類型、func類型), 如果要訪問成員變量時候需要寫成類似*p.field的形式時,只需要p.field即可訪問相應(yīng)的成員。

到此這篇關(guān)于Golang指針隱式間接引用的文章就介紹到這了,更多相關(guān)Golang指針內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Golang?IOT中的數(shù)據(jù)序列化與解析過程

    Golang?IOT中的數(shù)據(jù)序列化與解析過程

    這篇文章主要介紹了Golang?IOT中的數(shù)據(jù)序列化與解析,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-05-05
  • 在Golang代碼中如何自動生成版本號的方法示例

    在Golang代碼中如何自動生成版本號的方法示例

    這篇文章主要給大家介紹了在Golang代碼中如何自動生成版本號的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起看看吧。
    2017-07-07
  • Go語言自定義linter靜態(tài)檢查工具

    Go語言自定義linter靜態(tài)檢查工具

    這篇文章主要介紹了Go語言自定義linter靜態(tài)檢查工具,Go語言是一門編譯型語言,編譯器將高級語言翻譯成機器語言,會先對源代碼做詞法分析,詞法分析是將字符序列轉(zhuǎn)換為Token序列的過程,文章詳細(xì)介紹需要的小伙伴可以參考一下
    2022-05-05
  • Go語言中切片使用的注意事項小結(jié)

    Go語言中切片使用的注意事項小結(jié)

    切片是引用類型,相信對大家來說都不陌生,下面這篇文章主要給大家總結(jié)介紹了關(guān)于Go語言中切片使用的一些注意事項,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2018-01-01
  • Go語言入門13之runtime包案例講解

    Go語言入門13之runtime包案例講解

    這篇文章主要介紹了Go語言入門runtime包相關(guān)知識,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-05-05
  • Golang通脈之map詳情

    Golang通脈之map詳情

    這篇文章主要介紹了Golang通脈之map,Go語言中提供的映射關(guān)系容器為map,其內(nèi)部使用散列表(hash)實現(xiàn),map 是一種無序的鍵值對的集合。map 最重要的一點是通過 key 來快速檢索數(shù)據(jù),key 類似于索引,指向數(shù)據(jù)的值 map 是一種集合,所以可以像迭代數(shù)組和切片那樣迭代它
    2021-10-10
  • 使用Go語言創(chuàng)建靜態(tài)文件服務(wù)器問題

    使用Go語言創(chuàng)建靜態(tài)文件服務(wù)器問題

    這篇文章主要介紹了使用Go語言創(chuàng)建靜態(tài)文件服務(wù)器,本文通過試了代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-03-03
  • 一文帶你掌握Go語言運算符的使用

    一文帶你掌握Go語言運算符的使用

    運算符用于在程序運行時執(zhí)行數(shù)學(xué)或邏輯運算。Go 語言內(nèi)置的運算符有:算術(shù)運算符、關(guān)系運算符、邏輯運算符、位運算符、賦值運算符、其他運算符。本文將帶大家詳細(xì)了解一下這些運算符的使用,感興趣的可以了解一下
    2022-04-04
  • Golang高性能持久化解決方案BoltDB數(shù)據(jù)庫介紹

    Golang高性能持久化解決方案BoltDB數(shù)據(jù)庫介紹

    這篇文章主要為大家介紹了Golang高性能持久化解決方案BoltDB數(shù)據(jù)庫介紹,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步
    2021-11-11
  • Go實現(xiàn)生產(chǎn)隨機密碼的示例代碼

    Go實現(xiàn)生產(chǎn)隨機密碼的示例代碼

    這篇文章主要為大家詳細(xì)介紹了如何利用Go實現(xiàn)生產(chǎn)隨機密碼的,文中的示例代碼簡潔易懂,具有一定的借鑒價值,有需要的小伙伴可以參考一下
    2023-09-09

最新評論

崇仁县| 台中市| 南郑县| 新乡县| 遂川县| 新营市| 武乡县| 兰州市| 望谟县| 西畴县| 高邮市| 门源| 丰都县| 垫江县| 永顺县| 沾益县| 怀仁县| 公安县| 富锦市| 齐河县| 武邑县| 德格县| 微山县| 柯坪县| 乐平市| 富顺县| 南昌市| 北宁市| 新宁县| 北海市| 元朗区| 潢川县| 沙田区| 栾城县| 公主岭市| 余江县| 云浮市| 恩平市| 民权县| 昌都县| 濉溪县|