一篇文章帶你了解Go語言基礎(chǔ)之?dāng)?shù)組
前言
Hey,大家好呀,我是星期八,這次咱們繼續(xù)學(xué)習(xí)Go基礎(chǔ)之?dāng)?shù)組扒。
什么是數(shù)組
我的總結(jié):一個(gè)變量,指向一塊連續(xù)的,具有長度的,并且是相同類型的一塊內(nèi)存。
如何定義數(shù)組
- var 變量名 [元素個(gè)數(shù)]元素類型
示例:
- package main
- func main() {
- //聲明一個(gè)name_list數(shù)組,長度為100,里面只能放字符串
- var name_list [100]string
- }
注:
- var 變量名 [元素個(gè)數(shù)]元素類型 等同于 var 變量名 變量類型
- 所以
- var name1 [3]int != var name2 [4]int
- 因?yàn)樽兞款愋褪遣灰粯?,不可以直接進(jìn)行賦值
數(shù)組初始化
- package main
- import "fmt"
- func main() {
- //方式一,聲明不賦值
- //var name_list [10]int
- //fmt.Println(name_list) //結(jié)果:[0 0 0 0 0 0 0 0 0 0] 聲明不賦值,int類型默認(rèn)是0,其他類型也有默認(rèn)值
- //
- //方式二, 聲明沒有賦值完
- //var name_list [10]int = [10]int{1, 3}
- //fmt.Println(name_list) //結(jié)果:[1 3 0 0 0 0 0 0 0 0],沒有賦值完的,其他仍然是默認(rèn)值
- //方式三,聲明完完全賦值
- //var name_list = [3]int{1, 6, 10} //使用類型推斷方式,同上
- //fmt.Println(name_list) //結(jié)果:[1 6 10],每個(gè)都有值,沒啥可說的
- //方式四,自動(dòng)推斷個(gè)數(shù)
- //var name_list = [...]int{1, 2, 4, 5, 19} //...表示自動(dòng)推斷個(gè)數(shù),不會(huì)存在過多或者過少
- //fmt.Println(name_list) //結(jié)果:[1 2 4 5 19]
- //方式五,指定索引方式賦值,用的很少
- var name_list = [...]int{1: 66, 4: 11} //下標(biāo)1賦值為66,下標(biāo)4賦值11,其他默認(rèn)值
- fmt.Println(name_list) //結(jié)果:[0 66 0 0 11]
- }
數(shù)組遍歷
- package main
- import "fmt"
- func main() {
- var name_list = [...]string{"張三", "李四", "王五", "小劉"}
- //方式一,普通for遍歷
- //for i := 0; i < len(name_list); i++ {
- //fmt.Println(name_list[i])
- //}
- //方式二,for range方式
- for index, name := range name_list {
- //index是每個(gè)的下標(biāo),name是值
- fmt.Println(index, name)
- }
- }
多維數(shù)組
二維數(shù)組
通常情況下,二維數(shù)組基本夠用,最多三維數(shù)組,再套娃就完?duì)僮恿恕?/p>
定義一個(gè)二維數(shù)組
- package main
- import "fmt"
- func main() {
- //定義一個(gè)三行兩列的一個(gè)數(shù)組
- var student_list = [3][2]string{
- // 列 列
- {"張三", "李四"}, //行
- {"王五", "小劉"}, //行
- {"小七", "王八"}, //行
- }
- fmt.Println(student_list)
- }
循環(huán)二維數(shù)組
同理,定義一個(gè)二維數(shù)組需要兩層,循環(huán)也需要兩層。
- package main
- import "fmt"
- func main() {
- //定義一個(gè)三行兩列的一個(gè)數(shù)組
- var student_list = [3][2]string{
- // 列 列
- {"張三", "李四"}, //行
- {"王五", "小劉"}, //行
- {"小七", "王八"}, //行
- }
- //方式一,普通for循環(huán)
- //for i := 0; i < len(student_list); i++ {
- ////fmt.Println(student_list[i])//每行
- ///*
- // [張三 李四]
- // [王五 小劉]
- // [小七 王八]
- //*/
- //for j := 0; j < len(student_list[i]); j++ {
- // //每列
- // fmt.Println(student_list[i][j])
- //}
- //}
- //方式二,for range
- for _, v := range student_list {
- //fmt.Println(v) //每行
- /*
- [張三 李四]
- [王五 小劉]
- [小七 王八]
- */
- for _, b := range v {
- //每列
- fmt.Println(b)
- }
- }
- }
多維數(shù)組是否可以長度推導(dǎo)
代碼
- package main
- import "fmt"
- func main() {
- //定義一個(gè)三行兩列的一個(gè)數(shù)組
- var student_list = [...][...]string{
- // 列 列
- {"張三", "李四"}, //行
- {"王五", "小劉"}, //行
- {"小七", "王八"}, //行
- }
- fmt.Println(student_list)
- }
報(bào)錯(cuò)
似乎是不可以的,那我只用第一層試試呢。
- package main
- import "fmt"
- func main() {
- //定義一個(gè)三行兩列的一個(gè)數(shù)組
- var student_list = [...][2]string{
- // 列 列
- {"張三", "李四"}, //行
- {"王五", "小劉"}, //行
- {"小七", "王八"}, //行
- }
- fmt.Println(student_list)
- }
注:可以得出結(jié)論,在第一層時(shí),是可以實(shí)現(xiàn)長度自動(dòng)推導(dǎo)的。