package main

import "fmt"

func main() {

   // 1.数组的声明 关键字 变量名 [数组长度]数组类型  不初始化时数组元素值为零值
   var arr [5]int
   fmt.Println("arr=", arr) // arr= [0 0 0 0 0]

   // 对未初始化数组赋值
   arr[0] = 1
   arr[1] = 2
   arr[2] = 3
   arr[3] = 4
   arr[4] = 5
   fmt.Println("arr=", arr) // arr= [1 2 3 4 5]

   // 2.数组的声明 关键字 变量名 = [数组长度]数组类型{数组元素}
   var arrOne = [5]int{1, 2, 3, 4, 5}
   fmt.Println("arrOne=", arrOne) // arrOne= [1 2 3 4 5]

   // 3.数组的短声明 变量名 = [数组长度]数组类型{数组元素}
   arrTwo := [5]int{1, 2, 3, 4, 5}
   fmt.Println("arrTwo=", arrTwo) // arrTwo= [1 2 3 4 5]

   // 4.数组部分初始化  初始化部分有值未初始化部分零值
   arrThree := [5]int{1, 2}
   fmt.Println("arrThree=", arrThree) // arrThree= [1 2 0 0 0]

   // 5.数组指定索引初始化  初始化部分有值未初始化部分零值
   arrFour := [5]int{1: 3, 4: 2}
   fmt.Println("arrFour=", arrFour) // arrFour= [0 3 0 0 2]

   // 6.不定长数组 编译器判定
   arrFive := [...]int{1, 2, 3, 4, 5}
   fmt.Println("arrFive=", arrFive) // arrFive= [1 2 3 4 5]

   // 数组的长度
   fmt.Println("数组的长度是:", len(arrFive)) // 数组的长度是: 5

   // 数组遍历
   for index, value := range arrFive {
      fmt.Printf("arr=[%d]=%d\n", index, value) // arr=[0]=1 arr=[1]=2 arr=[2]=3 arr=[3]=4 arr=[4]=5
   }

   // 省略index遍历
   for _, value := range arrFive {
      fmt.Printf("arr=%d\n", value) // arr=1 arr=2 arr=3 arr=4 arr=5
   }

   // 7.数组的类型 数组的长度是类型的一部分 [3]int&[5]int 不是一个类型
   arrSix := [3]int{1, 2, 3}
   arrSeven := [5]int{1, 2, 3, 4, 5}
   fmt.Printf("arrSix的类型是%T\n", arrSix)     // arrSix的类型是[3]
   fmt.Printf("arrSeven的类型是%T\n", arrSeven) // arrSix的类型是[5]

   // 8.二维数组
   arrEight := [2][3]string{
      {"name", "long", "yang"},
      {"age", "23", "24"},
   }
   fmt.Println("arrEight=", arrEight) // arrEight= [[name long yang] [age 23 24]]

   // 9.数组的值传递 Go语言中数组是值类型不是引用类型
   arrNine := [3]int{1, 2, 3}

   arrTen := arrNine
   arrTen[0] = 5
   fmt.Println("arrNine=", arrNine) // arrNine= [1 2 3]
   fmt.Println("arrTen=", arrTen)   // arrTen= [5 2 3]

}