數(shù)組
數(shù)組是指一系列同一類型數(shù)據(jù)的集合荤胁。數(shù)組中包含的每個(gè)數(shù)據(jù)被稱為數(shù)組元素(element),一個(gè)數(shù)組包含的元素個(gè)數(shù)被稱為數(shù)組的長度艺谆。
1. 聲明方法
[32]byte //長度為32的數(shù)組
[2*N] struct {x, y int32} //復(fù)雜類型數(shù)組
[100]*float64 //指針數(shù)組
[3][5]int //二維數(shù)組
[2][2][2]float64 //等同于[2]([2]([2]float64))
數(shù)組的長度在聲明時(shí)就已經(jīng)確定榨惰,后面不能再次修改【蔡溃可以使用len()
函數(shù)來求數(shù)組的長度琅催。
2. 元素訪問
使用下標(biāo)訪問數(shù)組,同C語言一樣虫给,下標(biāo)也是從0開始
for i := 0; i < len(array); i++ {
fmt.Println("Element", i, "of array is", array[i])
}
當(dāng)然藤抡,我們也可以使用Go語言提供的range關(guān)鍵字來遍歷數(shù)組。
for i, v := range array {
fmt.Println("Element", i, "of array is", v)
}
3.值類型
Go語言中抹估,數(shù)組是值類型缠黍,作為參數(shù)傳遞時(shí),都會(huì)產(chǎn)生一次復(fù)制動(dòng)作棋蚌。所以嫁佳,在函數(shù)中不能
將數(shù)組作為參數(shù)傳遞挨队,因?yàn)樵诤瘮?shù)中操作的只不過是數(shù)組的副本而已。
package main
import "fmt"
func modify(array [5]int) {
array[0] = 10
fmt.Println("In Modify, array values:", array)
}
func main() {
array := [5]int{1, 2, 3, 4, 5}
modify(array)
fmt.Println("In Main, array values:", array)
}
它的輸出為:
In Modify, array values: [10 2 3 4 5]
In Main, array values: [1 2 3 4 5]
4.數(shù)組切片
在前面我們提到蒿往,數(shù)組有兩個(gè)特性
- 數(shù)組長度在定義后無法改變
- 數(shù)組是值類型盛垦,在參數(shù)傳遞時(shí)會(huì)產(chǎn)生副本。
這兩大特性使得數(shù)組無法適應(yīng)開發(fā)者的真實(shí)需求瓤漏。所以我們使用數(shù)組切片(Slice)來彌補(bǔ)
數(shù)組的不足腾夯。
從底層的角度看,數(shù)組切片仍然使用數(shù)組來管理元素蔬充〉悖基于數(shù)組,數(shù)組切片添加了一系列管理功能饥漫≌ゴ簦可以隨時(shí)動(dòng)態(tài)擴(kuò)充存放空間。并且在傳參時(shí)不會(huì)產(chǎn)生復(fù)制庸队。
4.1 基于數(shù)組創(chuàng)建數(shù)組切片
var marr [5]int = [5]int{1, 2, 3, 4, 5}
var mSlice []int = marr[:3]
Golang支持使用Array[first:last]的方式來基于數(shù)組生成一個(gè)數(shù)組切片积蜻。
4.2 直接創(chuàng)建數(shù)組切片
mySlice1 := make([]int, 5) //創(chuàng)建一個(gè)初始元素為5的數(shù)組切片,元素初始值為0
mySlice2 := make([]int, 5, 10) //創(chuàng)建一個(gè)初始元素為5的數(shù)組切片彻消,元素初始值為0,并且預(yù)留10個(gè)元素空間竿拆。
mySlice3 := []int{1, 2, 3, 4, 5} //創(chuàng)建,并初始化一個(gè)數(shù)組切片
4.3 遍歷
同數(shù)組一樣宾尚,我們可以使用下標(biāo)或者range的方式遍歷數(shù)組切片
4.4 動(dòng)態(tài)增減元素
Go語言內(nèi)置len()和cap()方法丙笋。len()函數(shù)返回?cái)?shù)組切片當(dāng)前存儲的元素個(gè)數(shù),cap()函數(shù)返回?cái)?shù)組切片分配的空間大小煌贴。例如:
mySlice := make([]int, 5, 10)
len(mySlice) //5
cap(mySlice) //10
4.4.1 新增元素
如果想往上面的mySlice數(shù)組切片添加元素御板,可以使用append()
函數(shù)。
mySlice = append(mySlice, 1, 2, 3) //mySlice末尾添加三個(gè)元素
mySlice2 := []int{8, 9, 10}
mySlice = append(mySlice, mySlice2...) //將mySlice2數(shù)組切片添加到mySlice末尾崔步。
5. 內(nèi)容復(fù)制
Go語言另一個(gè)內(nèi)置函數(shù)copy()稳吮,用于將內(nèi)容從一個(gè)數(shù)組切片復(fù)制到另一個(gè)數(shù)組切片。如果兩個(gè)數(shù)組切片不一樣大井濒。如果加入兩數(shù)組切片不一樣大灶似,就會(huì)按較小的那個(gè)數(shù)組切片的元素個(gè)數(shù)進(jìn)行復(fù)制。
slice1 := []int{1, 2, 3, 4, 5}
slice2 := []int{5, 4, 3}
copy(slice2, slice1) //只會(huì)復(fù)制slice1前三個(gè)元素到slice2中
copy(slice1, slice2) //只會(huì)復(fù)制slice2的3個(gè)元素到slice1的前三個(gè)位置瑞你。