溫馨提示×

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

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

Go語(yǔ)言的數(shù)組如何使用

發(fā)布時(shí)間:2023-02-28 16:23:32 來源:億速云 閱讀:91 作者:iii 欄目:開發(fā)技術(shù)

這篇文章主要講解了“Go語(yǔ)言的數(shù)組如何使用”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“Go語(yǔ)言的數(shù)組如何使用”吧!

什么是數(shù)組

什么是數(shù)組?數(shù)組是有固定長(zhǎng)度的相同數(shù)據(jù)類型元素的集合, 如下圖所示:

Go語(yǔ)言的數(shù)組如何使用

從數(shù)組的定義以及上面的示例圖我們可以得到數(shù)組的三個(gè)特征:

  • 固定長(zhǎng)度,數(shù)組的長(zhǎng)度在編譯時(shí)就要確定。

  • 每個(gè)元素的數(shù)據(jù)類型相同。

  • 數(shù)組索引從0開始,索引的最大值為數(shù)組長(zhǎng)度減1。

數(shù)組的創(chuàng)建

直接聲明數(shù)組變量,在聲明時(shí)必須指定長(zhǎng)度:

var iArray [2]int
var sArray [3]string

上面的代碼中,我們創(chuàng)建了一個(gè)長(zhǎng)度為2,元素?cái)?shù)據(jù)類型為int的數(shù)組和一個(gè)長(zhǎng)度為3,元素?cái)?shù)據(jù)類型為string的數(shù)組。

聲明后,就可以通過索引給對(duì)應(yīng)的元素賦值:

iArray[0] = 1
iArray[1] = 2
sArray[0] = "hello"
sArray[1] = "world"
sArray[2] = "!"

fmt.Println(iArray) //輸出 [1,2]
fmt.Println(sArray) //輸出 ["hello","world","!"]

也可以在聲明時(shí)通過花括號(hào){}直接初始化數(shù)組元素的值:

var iArray [2]int = [2]int{1,2}

//花括號(hào)內(nèi)初始化元素?cái)?shù)量可以少于數(shù)組的長(zhǎng)度,后面沒有初始化的元素會(huì)被賦予該數(shù)據(jù)類型的默認(rèn)值
var sArray [4]string = [4]string{"A","B","C"}

如果在聲明時(shí)或者之后沒有通過索引給數(shù)組的元素賦值,那么元素的值為對(duì)應(yīng)數(shù)據(jù)類型的初始值:

var iArray [3]int 
var sArray [4]string
fmt.Println(iArray) //輸出:[0,0,0]
fmt.Println(sArray) //輸出:[]

通知短變量可以讓數(shù)組聲明的更簡(jiǎn)潔:

i := [2]int{1,2}

也可以在聲明數(shù)組不指定數(shù)組長(zhǎng)度,而是通過...和花括號(hào){}內(nèi)的初始化值讓Go語(yǔ)言自動(dòng)推斷數(shù)組的長(zhǎng)度:

var i = [...]int{1, 2, 3, 4} //數(shù)組長(zhǎng)度為4

訪問數(shù)組的元素

通過索引可以訪問數(shù)組中的某個(gè)元素:

fmt.Println(iArray[0])

無論是給數(shù)組的元素賦值,還是訪問數(shù)組的元素都不超過數(shù)組的長(zhǎng)度,否則會(huì)數(shù)組越界的錯(cuò)誤,數(shù)組的索引從0開始,因此數(shù)組的索引取值范圍是0~len-1(len表示數(shù)組的長(zhǎng)度)。

iArray := [2]int{1,2}
sArray := [3]string{"A","B","C"}
iArray[2] = 10 //報(bào)錯(cuò),該數(shù)組索引的取值范圍是0~1
fmt.Println(sArray[10]) // 報(bào)錯(cuò),該數(shù)組索引的取值范圍是0~2

數(shù)組的長(zhǎng)度

Go內(nèi)置的函數(shù)len()可以用于獲得數(shù)組的長(zhǎng)度:

iArray := [4]int{1,2,3,4}
fmt.Println(len(iArray)) // 輸出結(jié)果:4

如何遍歷數(shù)組

遍歷數(shù)組使用for語(yǔ)句,有兩種方式:

使用for語(yǔ)句遍歷數(shù)組:

for i := 0; i < len(iArray); i++ {
	fmt.Println(iArray[i])
}

使用for-range遍歷數(shù)組:

for k,v := range iArray {
	fmt.Println(k,v)
}

for-range遍歷數(shù)組時(shí),可以獲取數(shù)組的索引和數(shù)組的元素,也可以在遍歷時(shí)選擇忽略索引或者元素值:

for _,v := range iArray { //忽略數(shù)組的索引
	fmt.Println(v)
}

for k,_ := range iArray{ //忽略元素
	fmt.Println(k)
}

數(shù)組的比較

數(shù)組只能進(jìn)行相等(==)或者不相等(!=)的比較,并且兩個(gè)進(jìn)行比較的數(shù)組要符合以下要求,否則代碼無法通過編譯:

  • 數(shù)組元素的數(shù)據(jù)類型必須一致

  • 數(shù)組的長(zhǎng)度必須一致

當(dāng)數(shù)組滿足上面的要求后,如果對(duì)應(yīng)索引元素值相同,則數(shù)組相等,否則不相等:

iArray1 := [2]int{1, 2}
iArray2 := [2]int{1, 2}
if iArray1 == iArray2 {
    print("相等")
} else {
    print("不相等")
}
//輸出:相等

iArray3 := [2]int{2, 1}
iArray4 := [2]int{1, 2}
if iArray1 == iArray2 {
    print("相等")
} else {
    print("不相等")
}

//輸出:不相等

查找數(shù)組中的元素

對(duì)于數(shù)組來說,要查找數(shù)組中是否存在某個(gè)元素,并返回其對(duì)應(yīng)索引,就要遍歷一個(gè)數(shù)組,并對(duì)每個(gè)元素進(jìn)行比較:

sArray := [5]string{"Java","PHP","Go","Python","JavaScript"}

for index, element := range sArray {
	if element == needle {
			fmt.Println(index)
		}
}

如果我們要查找的元素在數(shù)組的最后一個(gè),那么要遍歷整個(gè)數(shù)組才能查找到,查找元素的時(shí)間復(fù)雜度為O(n)。

將數(shù)組作為函數(shù)參數(shù)

把數(shù)組作為參數(shù)傳遞給函數(shù)時(shí),有幾個(gè)注意的地方:

  • 當(dāng)把數(shù)組作為參數(shù)傳給函數(shù)時(shí),Go會(huì)把數(shù)組復(fù)制一份傳給函數(shù),所以數(shù)組作為函數(shù)參數(shù)時(shí)是值傳遞而不是引用傳遞。

  • 數(shù)組作為參數(shù),會(huì)被復(fù)制,因此如果傳遞的數(shù)組很大,復(fù)制就會(huì)很耗時(shí)。

  • 傳遞給函數(shù)的數(shù)組,其長(zhǎng)度與數(shù)據(jù)類型必須函數(shù)形參一致,因此復(fù)用性很差。

func updateArray(haystack [5]int, index int, value int) error {
	if index >= len(haystack) {
		return errors.New("索引不能超過數(shù)組長(zhǎng)度")
	}

	haystack[index] = value
	fmt.Println(haystack) //[1 100 3 4 5]
	return nil
}

func main() {
	iArray := [5]int{1, 2, 3, 4, 5}
	updateArray(iArray, 1, 100)
	fmt.Println(iArray) // [1 2 3 4 5]
}

上面這個(gè)例子中,我們希望updateArray函數(shù)可以修改我們指定索引的元素?cái)?shù)組,但實(shí)際修改的復(fù)制后數(shù)組,與我們傳給函數(shù)的數(shù)組無關(guān),解決的辦法是傳遞數(shù)組的指針:

func updateArray(haystack *[5]int, index int, value int) error {
	if index >= len(haystack) {
		return errors.New("索引不能超過數(shù)組長(zhǎng)度")
	}

	haystack[index] = value
	fmt.Println(haystack) //[1 100 3 4 5]
	return nil
}

func main() {
	iArray := [5]int{1, 2, 3, 4, 5}
	updateArray(&iArray, 1, 100)
	fmt.Println(iArray) // [1 100 3 4 5]
}

雖然傳遞數(shù)組指針可以避免數(shù)組復(fù)制導(dǎo)致的性能問題,但是數(shù)組的長(zhǎng)度和元素?cái)?shù)據(jù)類型仍然要求一致,這大概就是數(shù)組不怎么被使用的原因吧:

func main() {
	iArray := [6]int{1, 2, 3, 4, 5} //把數(shù)組長(zhǎng)度改為6
	updateArray(&iArray, 1, 100)  //報(bào)錯(cuò)
}

同理,當(dāng)我們把一個(gè)數(shù)組變量賦值另外一個(gè)變量時(shí),Go也是把數(shù)組復(fù)制一份給新的變量,如果想把新的變量指向原來的數(shù)組,同樣是用數(shù)組的指針:

iArray := [2]int{1,2}

iArray1 := iArray

iArray[0] = 10

fmt.Println(iArray1) //輸出:[10,2]
fmt.Println(iArray) //輸出:[1,2]

iArray2 := &iArray
iArray2[0] = 20;

fmt.Println(iArray2) //輸出:&[20,2]
fmt.Println(iArray) //輸出:[20,2]

二維與多維數(shù)組

Go也支持二維和多維數(shù)組,其創(chuàng)建方式與一維數(shù)組類似:

二維數(shù)組:

iArrays := [3][2]string{{"A","B"},{"C","D"},{"E","F"}}

上述二維數(shù)組的結(jié)構(gòu)如下圖所示:

Go語(yǔ)言的數(shù)組如何使用

多維數(shù)組:

iArrays := [3][4][2]int{
		{
			{1, 2},
			{3, 4},
			{5, 6},
		},
		{
			{7, 8},
			{9, 10},
			{11, 12},
		},
		{
			{13, 14},
			{15, 16},
			{17, 18},
		},
	}

上述三維數(shù)組的結(jié)構(gòu)如下圖所示:

Go語(yǔ)言的數(shù)組如何使用

感謝各位的閱讀,以上就是“Go語(yǔ)言的數(shù)組如何使用”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對(duì)Go語(yǔ)言的數(shù)組如何使用這一問題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!

向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