- 1.和C語(yǔ)言一樣,Go語(yǔ)言中也有數(shù)組的概念, Go語(yǔ)言中的數(shù)組也是用于保存一組相同類(lèi)型的數(shù)據(jù)
- 2.和C語(yǔ)言一樣,Go語(yǔ)言中的數(shù)組也分為一維數(shù)組和多維數(shù)組
- 3.C語(yǔ)言中定義數(shù)組的格式
int ages[3]; - 4.Go語(yǔ)言中定義數(shù)組的格式
var ages [3]int - 5.C語(yǔ)言中操作數(shù)組的格式:
ages[索引]; - 6.Go語(yǔ)言中操作數(shù)組的格式和C語(yǔ)言一樣
var ages [3]int = [3]int{1, 3, 5}
// 取出數(shù)組中保存的值
fmt.Println(ages) //[1 3 5]
fmt.Println(ages[0])
fmt.Println(ages[1])
fmt.Println(ages[2])
7.C語(yǔ)言中數(shù)組的初始化方式有好幾種
7.1先定義再初始化
只能逐個(gè)初始化, 不能一次性初始化
7.2定義的同時(shí)初始化
int ages[3] = {1, 3, 5} // 完全初始化
int ages[3] = {1, 3} // 部分初始化
int ages[3] = {[2] = 3} // 指定元素, 部分初始化
int ages[] = {1, 3, 5} // 如果定義的同時(shí)初始化, 元素個(gè)數(shù)可以省略-
8.Go語(yǔ)言中數(shù)組的初始化方式有好幾種
8.1先定義再初始化// 1.定義一個(gè)數(shù)組 var ages [3]int // 2.給數(shù)組指定索引(下標(biāo))的元素賦值 ages[0] = 123 ages[1] = 456 ages[2] = 789
Go語(yǔ)言中的數(shù)組可以先定義再一次性初始化
// 1.定義一個(gè)數(shù)組 var ages [3]int // Go語(yǔ)言中的數(shù)組可以先定義再一次性初始化 ages = [3]int{1, 3, 5}
8.2定義的同時(shí)初始化
// 1.定義的同時(shí)初始化 var ages [3]int = [3]int{1, 3, 5} // 完全初始化 //var ages [3]int = [3]int{1, 3} // 部分初始化 //var ages [3]int = [3]int{2:5} // 指定元素初始化
Go語(yǔ)言數(shù)組和C語(yǔ)言一樣可以省略元素個(gè)數(shù)咱筛,但是有格式要求
// [...]的含義, 讓編譯器根據(jù)賦值的元素個(gè)數(shù)自動(dòng)計(jì)算數(shù)組的元素個(gè)數(shù)
ages := [...]int{1, 3, 5} // 省略元素個(gè)數(shù)
注意點(diǎn):
- 1.Go語(yǔ)言給數(shù)組一次性賦值的時(shí)候一定要在值的前面加上數(shù)組的類(lèi)型
var 數(shù)組名稱(chēng) 數(shù)據(jù)類(lèi)型 = 數(shù)據(jù)類(lèi)型{x , y, z}
而且必須要和數(shù)據(jù)類(lèi)型一模一樣 - 2.C語(yǔ)言中的數(shù)組如果沒(méi)有初始化保存的是垃圾數(shù)據(jù), 但是Go語(yǔ)言的數(shù)組 沒(méi)有初始化保存的不是垃圾數(shù)據(jù), 而是對(duì)應(yīng)類(lèi)型的零值
零值:
int/int8/int16/int32/int64/uint/uint8/uint16/uint32/uint64/byte/rune/uintptr的默認(rèn)值是0
float32/float64的默認(rèn)值是0.0
bool的默認(rèn)值是false
string的默認(rèn)值是""
pointer/function/interface/slice/channel/map/error的默認(rèn)值是nil
- 數(shù)組在Go語(yǔ)言中是值類(lèi)型,, 所以數(shù)組之間的賦值是拷貝關(guān)系, 而不是指向的關(guān)系(C語(yǔ)言數(shù)組是指向關(guān)系)
- 所以數(shù)組作為參數(shù)傳遞時(shí)也是值拷貝彼妻,在函數(shù)中修改數(shù)組元素值嫌佑,不會(huì)影響原數(shù)組
package main
import "fmt"
func main() {
ages := [3]int{1, 3, 5}
change(ages)
fmt.Println(ages) //[1 3 5]
}
func change(nums [3]int) {
nums[1] = 666
}
- 如果想讓兩個(gè)數(shù)組可以相互賦值, 那么兩個(gè)數(shù)組的**類(lèi)型必須一致,類(lèi)型一致包括元素個(gè)數(shù), 元素個(gè)數(shù)也是Go語(yǔ)言中數(shù)組類(lèi)型的一部分
var ages [3]int = [3]int{1, 3, 5}
var nums [3]int
nums = ages
fmt.Println(ages) //[1 3 5]
fmt.Println(nums) //[1 3 5]
- 如果數(shù)組中存儲(chǔ)的元素類(lèi)型支持== != 操作,而且兩個(gè)數(shù)組的類(lèi)型是一個(gè)樣的, 那么數(shù)組也支持== !=操作
var ages [3]int = [3]int{1, 3, 5}
var nums [3]int = [3]int{1, 2, 5}
res := ages == nums
fmt.Println(res) //false
- Go語(yǔ)言中遍歷數(shù)組
- 1.傳統(tǒng)的for循環(huán)遍歷數(shù)組
ages := [3]int{1, 3, 5}
for i:=0; i < 3; i++ {
//fmt.Println(ages[i]) //1 3 5
fmt.Printf("index = %d, value = %d\n", i, ages[i])
}
- 2.高級(jí)for循環(huán)來(lái)遍歷數(shù)組(相當(dāng)于其他語(yǔ)言中的forin循環(huán))
//range函數(shù)的兩個(gè)返回值變量名任取
//for i,v:=range ages{
// fmt.Println(i,v)
//}
for index, value := range ages {
fmt.Println(index, value)
}
/*
0 1
1 3
2 5
*/
-
定義二維數(shù)組的格式
var 數(shù)組名稱(chēng) [行數(shù)][列數(shù)]數(shù)據(jù)類(lèi)型
var 數(shù)組名稱(chēng) [一維數(shù)組的個(gè)數(shù)][每個(gè)一維數(shù)組的元素個(gè)數(shù)]數(shù)據(jù)類(lèi)型
var arr [2][3]int = [2][3]int{
{1,2,3},
{4,5,6},
}
fmt.Println(arr) //[[1 2 3] [4 5 6]]
- 修改數(shù)組元素方式和C語(yǔ)言一樣
var values [2][3]int = [2][3]int{
{1, 3, 5},
{2, 4, 5},
}
values[0][1] = 666
fmt.Println(values) //[[1 666 5] [2 4 5]]
- 注意點(diǎn):
二維數(shù)組也可以省略元素個(gè)數(shù), 但是只能省略行數(shù), 不能省略列數(shù)
//省略的元素個(gè)數(shù)必須用...代替,若[]中不寫(xiě)...則代表的是切片侨歉,而非數(shù)組
values := [...][3]int{
{1, 3, 5},
{2, 4, 5},
}
fmt.Println(values) //[[1 3 5] [2 4 5]]
// 這里代表定義了一個(gè)切片, 切片中保存的是數(shù)組
//values := [][3]int{
// {1, 3, 5},
// {2, 4, 5},
//}
// 這里代表定義了一個(gè)切片, 切片中保存的是切片
//values := [][]int{
// {1, 3, 5},
// {2, 4, 5},
//}