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

Go語(yǔ)言學(xué)習(xí)教程之指針的示例詳解

 更新時(shí)間:2022年09月28日 09:42:56   作者:任沫  
這篇文章主要通過(guò)簡(jiǎn)單的練習(xí)來(lái)讓大家對(duì)Go語(yǔ)言中的指針有所了解,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Go語(yǔ)言有一定幫助,需要的可以參考一下

前言

關(guān)于指針的主要幾點(diǎn):

  • 指針類型:一個(gè)指針類型*T表示指向給定類型的變量的所有指針的集合,該給定類型T稱為基本類型。未初始化的指針的值是nil。
  • 變量:一個(gè)變量是保存一個(gè)值的存儲(chǔ)位置。允許的值的集合由變量的類型決定。
  • 尋址操作:對(duì)于類型為T的操作數(shù)x,尋址操作&x會(huì)產(chǎn)生一個(gè)指向x的類型為*T的指針。對(duì)于指針類型為*T的操作數(shù)y,指針間接尋址*y表示y指向的類型為T的變量。

本文使用的Go版本:

$ go version
go version go1.18 darwin/amd64

練習(xí)1

var a int = 111
var b *int = &a

fmt.Println("a的值是:", a)   // 111
fmt.Println("a的地址是:", &a) // 0xc000016098
fmt.Println("b的值是:", b)   // 0xc000016098
fmt.Println("b的地址是:", &b) // 0xc0000ac018

*b = *b + 1
fmt.Println(a, b) // 112 0xc000016098

代碼中聲明了一個(gè)整型的變量a,以及一個(gè)指向整型變量a*int類型的指針變量b

內(nèi)存地址表示數(shù)據(jù)在內(nèi)存中存放的位置。如上圖所示,a相當(dāng)于是內(nèi)存地址0xc000016098的一個(gè)名字(用于引用計(jì)算機(jī)內(nèi)存地址),當(dāng)我們獲取a的值時(shí),就是獲取內(nèi)存地址0xc000016098存儲(chǔ)的數(shù)據(jù)。而指針類型的變量b(代表內(nèi)存地址0xc0000ac018)存儲(chǔ)的是變量a代表的地址,它存儲(chǔ)的值就是一個(gè)地址。

當(dāng)使用*b進(jìn)行指針間接尋址時(shí),可以理解為:找到b代表的內(nèi)存地址0xc0000ac018中存儲(chǔ)的值,存儲(chǔ)的是一個(gè)地址0xc000016098,于是去拿地址0xc000016098中存儲(chǔ)的值111

當(dāng)對(duì)*b進(jìn)行賦值時(shí)(首先賦值符號(hào)=右側(cè)已經(jīng)計(jì)算出結(jié)果為112了),將b代表的內(nèi)存地址0xc0000ac018中,存儲(chǔ)的地址0xc000016098中,存儲(chǔ)的值改為112。修改的是內(nèi)存地址0xc000016098中存儲(chǔ)的值,所以再次打印a(代表內(nèi)存地址0xc000016098)的值時(shí),已經(jīng)變?yōu)榱?code>112。

練習(xí)2

對(duì)于類型為T的操作數(shù)x,尋址操作&x會(huì)產(chǎn)生一個(gè)指向x的類型為*T的指針。

操作數(shù)必須是可尋址的,即變量、指針間接引用、切片索引操作;或者一個(gè)可尋址的結(jié)構(gòu)體操作數(shù)的字段選擇;或者一個(gè)可尋址的數(shù)組的數(shù)組索引操作。

有一個(gè)特殊的情況是,x可能是一個(gè)復(fù)合字面量,復(fù)合字面量(結(jié)構(gòu)體字面量、數(shù)組字面量、切片字面量、映射字面量)是不可尋址的,但是依然可以使用&x。對(duì)復(fù)合字面量進(jìn)行&x操作,會(huì)生成一個(gè)指針,這個(gè)指針指向使用字面量的值進(jìn)行初始化的一個(gè)唯一變量。

如果對(duì)x的計(jì)算會(huì)導(dǎo)致運(yùn)行時(shí)錯(cuò)誤,那么對(duì)&x的計(jì)算也會(huì)導(dǎo)致運(yùn)行時(shí)錯(cuò)誤。

var c float64 = 222.22
fmt.Println(&c) // 1. 對(duì)變量c進(jìn)行尋址操作 0xc0000b2008
var d *float64 = &c
fmt.Println(&*d) // 2.對(duì)指針間接引用(*d)進(jìn)行尋址操作 0xc0000b2008

e := make([]string, 2) // 創(chuàng)建一個(gè)初始長(zhǎng)度為2的切片
e = []string{"e1", "e2"}
fmt.Println(&e[1]) // 3. 對(duì)切片索引操作進(jìn)行尋址操作 0xc0000b8030

type F struct {
    a string
    b int
}
fmt.Println(&F{"a", 1}) // 4.對(duì)結(jié)構(gòu)體字面量進(jìn)行尋址操作 &{a 1}
var f F = F{"b", 123}
fmt.Println(&f.a) // 5. 對(duì)結(jié)構(gòu)體的字段選擇進(jìn)行尋址操作 0xc0000a4048

var g = [3]int{1, 2, 3}       // 創(chuàng)建一個(gè)數(shù)組
fmt.Println(&g[0])            // 6. 對(duì)數(shù)組的索引操作進(jìn)行尋址操作 0xc0000ba000
fmt.Println(&[3]int{4, 5, 6}) // 7. 對(duì)數(shù)組字面量進(jìn)行尋址操作 &[4 5 6]

// var h *int = nil
// fmt.Println(*h)  // 會(huì)導(dǎo)致一個(gè)運(yùn)行時(shí)錯(cuò)誤:panic: runtime error: invalid memory address or nil pointer dereference
// fmt.Println(&*h) // 會(huì)導(dǎo)致一個(gè)運(yùn)行時(shí)錯(cuò)誤:panic: runtime error: invalid memory address or nil pointer dereference

練習(xí)3

var i int = 1
fmt.Println("i的地址", &i) // i的地址 0xc000016098

increase(i)           // 函數(shù)內(nèi)部i的地址 0xc0000160b0
fmt.Println("i的值", i) // i的值 1

increaseV1(&i)        // 函數(shù)內(nèi)部拿到的i的地址 0xc000016098
fmt.Println("i的值", i) // i的值 2

func increase(i int) {
    fmt.Println("函數(shù)內(nèi)部i的地址", &i)
    i++
}

func increaseV1(ptrI *int) {
    fmt.Println("函數(shù)內(nèi)部拿到的i的地址", &*ptrI)
    *ptrI++
}

將變量作為參數(shù)傳遞到函數(shù)中的時(shí)候,函數(shù)會(huì)復(fù)制變量中的值到局部變量中,所以不會(huì)改變外部變量的值。

在調(diào)用increase(i)時(shí),會(huì)創(chuàng)建一個(gè)新的局部變量i,這個(gè)變量i的作用域在函數(shù)內(nèi)部,初始化的值是復(fù)制的外部變量i中的值。所以在函數(shù)內(nèi)部執(zhí)行i++的時(shí)候,改變的是局部變量i的值,不會(huì)影響到外部變量。執(zhí)行完之后外部的i的值還是1。

當(dāng)執(zhí)行increaseV1(&i)時(shí),傳入的是一個(gè)指向外部i的指針,它表示的地址是外部i的地址0xc000016098,所以在函數(shù)內(nèi)部執(zhí)行*ptrI++時(shí),改變的是地址0xc000016098中存儲(chǔ)的值,執(zhí)行完函數(shù)之后,打印外部的i(代表內(nèi)存地址0xc000016098)的值,發(fā)現(xiàn)值已經(jīng)變?yōu)?code>2了。

到此這篇關(guān)于Go語(yǔ)言學(xué)習(xí)教程之指針的示例詳解的文章就介紹到這了,更多相關(guān)Go語(yǔ)言指針內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Go語(yǔ)言中println和fmt.Println區(qū)別

    Go語(yǔ)言中println和fmt.Println區(qū)別

    本文主要介紹了Go語(yǔ)言中println和fmt.Println區(qū)別,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07
  • Go語(yǔ)言中命令行參數(shù)解析工具pflag的使用指南

    Go語(yǔ)言中命令行參數(shù)解析工具pflag的使用指南

    在使用?Go?進(jìn)行開發(fā)的過(guò)程中,命令行參數(shù)解析是我們經(jīng)常遇到的需求,于是?Go?社區(qū)中出現(xiàn)了一個(gè)叫?pflag?的第三方包,功能更加全面且足夠強(qiáng)大,下面我們就來(lái)看看它的具體使用吧
    2024-11-11
  • Go?Fiber快速搭建一個(gè)HTTP服務(wù)器

    Go?Fiber快速搭建一個(gè)HTTP服務(wù)器

    Fiber?是一個(gè)?Express?啟發(fā)?web?框架基于?fasthttp?,最快?Go?的?http?引擎,這篇文章主要介紹了Go?Fiber快速搭建一個(gè)HTTP服務(wù)器,需要的朋友可以參考下
    2023-06-06
  • Go語(yǔ)言類型轉(zhuǎn)換及問(wèn)題探討

    Go語(yǔ)言類型轉(zhuǎn)換及問(wèn)題探討

    本文探討了Go語(yǔ)言中的類型轉(zhuǎn)換機(jī)制,特別是在使用atomic.Pointer和unsafe時(shí)可能引發(fā)的問(wèn)題,通過(guò)深入分析Go語(yǔ)言的類型轉(zhuǎn)換規(guī)則,如數(shù)值類型間轉(zhuǎn)換、字符串與byte/rune切片轉(zhuǎn)換、slice與數(shù)組轉(zhuǎn)換,以及底層類型相同時(shí)的轉(zhuǎn)換,文章最后給出了一些在Go中使用類型轉(zhuǎn)換的建議
    2024-10-10
  • Go語(yǔ)言中錯(cuò)誤處理的方式總結(jié)

    Go語(yǔ)言中錯(cuò)誤處理的方式總結(jié)

    這篇文章會(huì)結(jié)合?errors?中的函數(shù),來(lái)討論一下?Go?中常見(jiàn)的?error?使用方式,文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價(jià)值,需要的可以了解一下
    2023-07-07
  • 在Gin框架中解決跨域問(wèn)題的多種方法

    在Gin框架中解決跨域問(wèn)題的多種方法

    在使用Go語(yǔ)言進(jìn)行Web開發(fā)時(shí),Gin框架因其簡(jiǎn)潔、高效的特點(diǎn)而被廣泛使用,然而,在實(shí)際開發(fā)中,跨域問(wèn)題(CORS, Cross-Origin Resource Sharing)是一個(gè)常見(jiàn)的挑戰(zhàn),本文將結(jié)合實(shí)際案例,詳細(xì)介紹在Gin框架中解決跨域問(wèn)題的多種方法,需要的朋友可以參考下
    2024-10-10
  • Go語(yǔ)言中一定要知道的切片使用注意事項(xiàng)總結(jié)

    Go語(yǔ)言中一定要知道的切片使用注意事項(xiàng)總結(jié)

    了解和掌握切片的使用注意事項(xiàng),可以避免意外的程序行為,所以本文就來(lái)和大家深入探討一下Go語(yǔ)言切片常見(jiàn)的注意事項(xiàng),希望對(duì)大家有所幫助
    2023-06-06
  • Go語(yǔ)言學(xué)習(xí)之goroutine詳解

    Go語(yǔ)言學(xué)習(xí)之goroutine詳解

    Goroutine是建立在線程之上的輕量級(jí)的抽象。它允許我們以非常低的代價(jià)在同一個(gè)地址空間中并行地執(zhí)行多個(gè)函數(shù)或者方法,這篇文章主要介紹了Go語(yǔ)言學(xué)習(xí)之goroutine的相關(guān)知識(shí),需要的朋友可以參考下
    2020-02-02
  • Go語(yǔ)言中的閉包詳解

    Go語(yǔ)言中的閉包詳解

    本文詳細(xì)講解了Go語(yǔ)言中的閉包,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-07-07
  • Golang中常見(jiàn)加密算法的總結(jié)

    Golang中常見(jiàn)加密算法的總結(jié)

    這篇文章主要為大家詳細(xì)介紹了Golang中常見(jiàn)的一些加密算法的實(shí)現(xiàn),文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價(jià)值,感興趣的小伙伴可以了解一下
    2023-03-03

最新評(píng)論

江达县| 阳原县| 华蓥市| 福清市| 内乡县| 山阴县| 博爱县| 霍邱县| 长乐市| 乐都县| 乌什县| 五指山市| 司法| 陈巴尔虎旗| 通化市| 淄博市| 上杭县| 卢湾区| 石家庄市| 金湖县| 临城县| 喀什市| 漠河县| 连山| 吴旗县| 黔江区| 吉安县| 九台市| 麟游县| 修武县| 澄迈县| 晋中市| 呼和浩特市| 南投市| 绥宁县| 汪清县| 五华县| 四子王旗| 枣强县| 南和县| 稷山县|