欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Go指針數(shù)組和數(shù)組指針的具體使用

 更新時(shí)間:2024年03月21日 09:41:49   作者:小歐不菜  
go語(yǔ)言跟c語(yǔ)言一樣,指針數(shù)組和數(shù)組指針概念容易搞混,本文主要介紹了Go指針數(shù)組和數(shù)組指針的具體使用,具有一定的參考價(jià)值,感興趣的可以了解一下

這個(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)建

    這篇文章主要介紹了詳解Go語(yǔ)言RESTful JSON API創(chuàng)建,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-05-05
  • Go打包附件內(nèi)容到執(zhí)行文件的方法

    Go打包附件內(nèi)容到執(zhí)行文件的方法

    處于種種原因, 我們不希望這部分額外的內(nèi)容以附件的形式出現(xiàn), 有沒(méi)有什么辦法能夠?qū)⒏郊?nèi)容直接打包進(jìn)可執(zhí)行文件中呢,下面小編給大家介紹下Go打包附件內(nèi)容到執(zhí)行文件的方法,感興趣的朋友一起看看吧
    2023-03-03
  • Go語(yǔ)言命令行參數(shù)及cobra使用方法

    Go語(yǔ)言命令行參數(shù)及cobra使用方法

    Cobra是關(guān)于golang的一個(gè)命令行解析庫(kù),用它能夠快速創(chuàng)建功能強(qiáng)大的 cli應(yīng)用程序和命令行工具,本文主要介紹了Go語(yǔ)言命令行參數(shù)及cobra使用方法,感興趣的可以了解一下
    2024-01-01
  • Go語(yǔ)言實(shí)現(xiàn)的web爬蟲(chóng)實(shí)例

    Go語(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-02
  • GO語(yǔ)言數(shù)組和切片實(shí)例詳解

    GO語(yǔ)言數(shù)組和切片實(shí)例詳解

    這篇文章主要介紹了GO語(yǔ)言數(shù)組和切片的用法,以實(shí)例形式較為詳細(xì)的分析了GO語(yǔ)言中數(shù)組與切片的創(chuàng)建及使用技巧,是深入學(xué)習(xí)GO語(yǔ)言的基礎(chǔ),需要的朋友可以參考下
    2014-12-12
  • Go語(yǔ)言web快速開(kāi)發(fā)框架Gin的HttpRouter路由的使用

    Go語(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-03
  • Golang在Mac、Linux、Windows下如何交叉編譯的實(shí)現(xiàn)

    Golang在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-03
  • Go語(yǔ)言中調(diào)用外部命令的方法總結(jié)

    Go語(yǔ)言中調(diào)用外部命令的方法總結(jié)

    在工作中,我們時(shí)不時(shí)地會(huì)需要在Go中調(diào)用外部命令。本文為大家總結(jié)了Go語(yǔ)言中調(diào)用外部命令的幾種姿勢(shì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2022-11-11
  • Go使用sync.Pool提高性能的代碼示例

    Go使用sync.Pool提高性能的代碼示例

    在高性能應(yīng)用程序中,頻繁的內(nèi)存分配和回收是性能瓶頸的常見(jiàn)原因之一,Go 語(yǔ)言提供了 sync.Pool 類(lèi)型,它可以用來(lái)存儲(chǔ)和重用臨時(shí)對(duì)象,本文將詳細(xì)介紹如何在 Go 中使用 sync.Pool,并通過(guò)實(shí)際代碼示例來(lái)展示其對(duì)性能的提升效果,需要的朋友可以參考下
    2024-04-04
  • GO?env環(huán)境變量配置命令使用

    GO?env環(huán)境變量配置命令使用

    這篇文章主要為大家介紹了GO?env環(huán)境變量配置命令使用,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-05-05

最新評(píng)論