一、数组简介
数组是一种可以存放多个同一类型数据的数据类型,在Go中,数组是值类型。
- 数组定义
var 数组名 [数组大小]数据类型
如:var a [5]int
- 内存布局
package main import "fmt" func main() { var intArr [3]int fmt.Println("intArr=", intArr) } /* intArr= [0 0 0] */
对于上面的代码中,定义一个整型的、长度为3的数组,默认的数组值为0。
可以通过赋值进行初始化,改变默认值。
其中,数组的地址可以通过数组名称来获取 &intArr;数组的第一个元素的地址就是数组的地址;数组的各个元素的地址间隔一句数组的类型决定,比如 int64对应的数组元素地址间隔是8。
二、数组使用
(一)基本使用
1、数组初始化
package main import "fmt" func main() { // 数组初始化 // 方式一 var numArr1 [5]int = [5]int{1,2,3,4,5} // 方式二 var numArr2 = [5]int{1,2,3,4,5} // 方式三 var numArr3 = [...]int{1,2,3,4,5} // 方式四 var numArr4 = [...]int{1:2, 0:1, 2:3, 3:4, 4:5} // 方式五 类型推导 numArr5 := [...]string{"zhangsan", "lisi", "wangwu"} fmt.Println("numArr1", numArr1) fmt.Println("numArr2", numArr2) fmt.Println("numArr3", numArr3) fmt.Println("numArr4", numArr4) fmt.Println("numArr5", numArr5) } /* numArr1 [1 2 3 4 5] numArr2 [1 2 3 4 5] numArr3 [1 2 3 4 5] numArr4 [1 2 3 4 5] numArr5 [zhangsan lisi wangwu] */
2、访问数组
package main import "fmt" func main() { var intArr [3]int = [3]int{4, 5, 6} fmt.Println("第三个元素", intArr[2]) // 第三个元素 3 for i := 0; i < len(intArr); i++ { fmt.Printf("第%d个元素=%d \n", i, intArr[i]) } } /* 通过intArr[索引值]取值
第0个元素=4 第1个元素=5 第2个元素=6 */
(二)for-range
package main import "fmt" func main() { var intArr [3]int = [3]int{4, 5, 6} for i, v := range intArr { fmt.Printf("i=%v, v=%v \n", i, v) } } /* i=0, v=4 i=1, v=5 i=2, v=6 */
- i 数组的下标
- v 是数组中i下标位置的值
- i,v是for代码块中的局部变量
- 如果忽略下标i,可以使用"_"
(三)应用案例
随机生成5个数,并将其反转打印。
package main import ( "fmt" "time" "math/rand" ) func main() { var intArr [5]int len := len(intArr) rand.Seed(time.Now().UnixNano()) for i := 0; i < len; i++ { intArr[i] = rand.Intn(100) // 生成 大于等于0,小于100的5个数 } fmt.Println("交换前:", intArr) // 进行交换 temp := 0 for i := 0; i < len / 2; i++ { temp = intArr[len - 1 - i] intArr[len - 1 - i] = intArr[i] intArr[i] =temp } fmt.Println("交换后:", intArr) } /* 交换前: [42 43 95 0 67] 交换后: [67 0 95 43 42] */
三、注意事项
- 数组是多个相同类型数据的组合,一旦一个数组定义了,长度是固定的,不能动态变化
- var arr []int 此时arr是一个slice切片
- 数组中的元素可以是任何类型的数据,但是不能混用
- 数组创建后,如果没有初始化赋值,数值默认值是0,字符串是"",bool数组是false
- 使用数组的步骤,(1)声明数组并且开辟空间;(2)给数组各个元素赋值;(3)使用数组
- 数组下标是从0开始的,如果越界使用会报错
- Go中的数组是值类型,因此拷贝不会互相影响,如果需要改变之前的数组中的值,可以传入数组引用