Go指針數(shù)組和數(shù)組指針的具體使用
這個(gè)章節(jié)將會(huì)簡(jiǎn)單講Go 的指針數(shù)組和數(shù)組指針。
我相信學(xué)習(xí)Go的同學(xué)們,應(yīng)該都是接觸過(guò)別的語(yǔ)言吧,Go應(yīng)該是大部分同學(xué)的第二門(mén)甚至第好幾門(mén)的語(yǔ)言吧,所以大家應(yīng)該都有一定的語(yǔ)言基礎(chǔ)了,言歸正傳。
先說(shuō)概念:
指針數(shù)組就是一個(gè)數(shù)組,這個(gè)數(shù)組的元素是指針(C語(yǔ)言也是這樣)
數(shù)組指針就是一個(gè)指針,這個(gè)指針指向一個(gè)數(shù)組(C語(yǔ)言也是這樣)
好了,概念講完了非常簡(jiǎn)單,直接上代碼
一、指針數(shù)組
func My_Print(p [3]*int) { fmt.Println(p) for _, val := range p { fmt.Printf("%d ", *val) } fmt.Println() } func F_1() { a1, a2, a3 := 77, 88, 99 p1 := [3]*int{&a1, &a2, &a3} p2 := F_2(p1) fmt.Printf("After modification") My_Print(p2) } func F_2(p [3]*int) [3]*int { fmt.Printf("Before modification") My_Print(p) for i := 0; i < 3; i++ { //我們改變這個(gè)指針數(shù)組里面的指針的內(nèi)容 *(p[i]) = i } return p } func main() { F_1() }
我們直接講代碼,這里有三個(gè)函數(shù)My_Print(p [3]*int)、F_1()、F_2(p [3]*int) [3]*int:
My_Print(p [3]*int) 形參是一個(gè)指針數(shù)組 ,這就是一個(gè)打印這個(gè)指針數(shù)組里面的內(nèi)容,數(shù)組里面的內(nèi)容是指針(指向一個(gè)地址),地址里面是一個(gè)整形變量,這個(gè)函數(shù)就是把它們都打印出來(lái)。
F_1() 這個(gè)函數(shù)就是頂一個(gè)指針數(shù)組并且初始化,指針數(shù)組里面放指針?biāo)晕覀兘o他初始化三個(gè)地址,并且把這個(gè)指針數(shù)組當(dāng)做參數(shù)傳給F_2()
F_2() 這個(gè)函數(shù)會(huì)先調(diào)用My_Print打印形參內(nèi)容,在修改這個(gè)形參。
運(yùn)行結(jié)果如下:
Before modification[0xc000134000 0xc000134008 0xc000134010]
77 88 99
After modification[0xc000134000 0xc000134008 0xc000134010]
0 1 2
可以看出修改前和修改后 ,指針數(shù)組里面的指針(這個(gè)地址)并沒(méi)有變,但是這個(gè)指針里的內(nèi)容已經(jīng)被改變了。
二、數(shù)組指針
直接上代碼:
func main() { //F_1() F_3() } func F_3() { var p *[3]int arr := [3]int{1, 2, 3} p = &arr fmt.Printf("p = %p,arr = %p\n", p, &arr) F_4(p) fmt.Println("F_3():", p) } func F_4(p *[3]int) { // 這里也算是Go的一個(gè)語(yǔ)言特性吧,編譯器可以認(rèn)為p是arr的地址,也可以認(rèn)為p是arr的引用 fmt.Println("F_4():", p) p[0] = 11 p[1] = 22 p[2] = 33 fmt.Println("F_4():", p) (*p)[0] = 99 (*p)[1] = 88 (*p)[2] = 77 fmt.Println("F_4():", p) }
運(yùn)行結(jié)果如下:
p = 0xc000122000,arr = 0xc000122000
F_4(): &[1 2 3]
F_4(): &[11 22 33]
F_4(): &[99 88 77]
F_3(): &[99 88 77]
這個(gè)數(shù)組指針,倒是沒(méi)啥難懂的,但是這個(gè)可能會(huì)讓大家疑惑的應(yīng)該就是那個(gè)F_4()函數(shù)里面那樣寫(xiě)的問(wèn)題了。這應(yīng)該是和Go的GC機(jī)制有關(guān)。我們?cè)?a rel="external nofollow" target="_blank">go學(xué)習(xí)中提過(guò),一個(gè)問(wèn)題就是一個(gè)指針指向一個(gè)局部變量然后返回這個(gè)指針,可是在外部這個(gè)指針依舊可以訪問(wèn)到這個(gè)變量的內(nèi)容。
在Go中一個(gè)變量如果在他作用域之外還有存在它的引用時(shí),他是不會(huì)被內(nèi)存回收走的,它會(huì)存在一個(gè)引用它的計(jì)數(shù)值,但又多一個(gè)它的引用,那它的計(jì)數(shù)值加一,反之減一。直到它的引用為零時(shí),GC就會(huì)回收這份空間。
個(gè)人理解:所以這個(gè)形參p也是跟這個(gè)GC機(jī)制有關(guān),寫(xiě)法上它就是arr的地址,但是編譯器也可以認(rèn)為他是arr的引用。
最后分享
不管是學(xué)Go或者學(xué)C的同學(xué),可能都有點(diǎn)分不清數(shù)組指針和指針數(shù)組,這里是我自己分辨他們兩的方法:
概念上,正如上面所說(shuō)的:
指針數(shù)組就是一個(gè)數(shù)組,這個(gè)數(shù)組的元素是指針(C語(yǔ)言也是這樣)
數(shù)組指針就是一個(gè)指針,這個(gè)指針指向一個(gè)數(shù)組(C語(yǔ)言也是這樣)
寫(xiě)法上:
[] 在 * 前面,那他就是一個(gè)數(shù)組,所以是指針數(shù)組,反之?dāng)?shù)組指針。(在Go中我是這里記的)
(*a)[], * 被括號(hào)起來(lái),說(shuō)明要a先跟 * 結(jié)合,所以這個(gè)一個(gè)指針,也就是數(shù)組指針,反之指針數(shù)組(C語(yǔ)言中我是這么記的)
到此這篇關(guān)于Go指針數(shù)組和數(shù)組指針的具體使用的文章就介紹到這了,更多相關(guān)Go指針數(shù)組和數(shù)組指針內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
詳解Go語(yǔ)言RESTful JSON API創(chuàng)建
這篇文章主要介紹了詳解Go語(yǔ)言RESTful JSON API創(chuàng)建,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-05-05Go語(yǔ)言實(shí)現(xiàn)的web爬蟲(chóng)實(shí)例
這篇文章主要介紹了Go語(yǔ)言實(shí)現(xiàn)的web爬蟲(chóng),實(shí)例分析了web爬蟲(chóng)的原理與Go語(yǔ)言的實(shí)現(xiàn)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-02-02Go語(yǔ)言web快速開(kāi)發(fā)框架Gin的HttpRouter路由的使用
in框架內(nèi)部使用了高性能的路由器庫(kù)httprouter,支持動(dòng)態(tài)參數(shù)匹配和簡(jiǎn)潔的接口,本文主要介紹了Go語(yǔ)言web快速開(kāi)發(fā)框架Gin的HttpRouter路由的使用,感興趣的可以了解一下2025-03-03Golang在Mac、Linux、Windows下如何交叉編譯的實(shí)現(xiàn)
這篇文章主要介紹了Golang在Mac、Linux、Windows下如何交叉編譯的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-03-03Go語(yǔ)言中調(diào)用外部命令的方法總結(jié)
在工作中,我們時(shí)不時(shí)地會(huì)需要在Go中調(diào)用外部命令。本文為大家總結(jié)了Go語(yǔ)言中調(diào)用外部命令的幾種姿勢(shì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2022-11-11