ch9、数组和切片
什么是数组?用于保存一组相同类型
的数据结构。
1、数组声明、初始化
Go中数组定义之后就就有默认的初始值
,默认初始值就是保存数据类型的默认值(零值)。
package array_test
import "testing"
func TestArrayInit(t *testing.T) {
// 方式一: 先声明后使用,默认值是int默认值
var arr [3]int
// 方式二:声明即初始化为默认值,推荐使用该方法
arr1 := [4]int{
1, 2, 3, 4}
// 方式三:通过...来声明并初始化,不使用...表示的是切片(slice)
arr2 := [...]int{
1, 3, 4, 5}
arr1[1] = 5
t.Log(arr[1], arr[2])
t.Log(arr1, arr2)
}
-
数组比较注意点
-
Go语言中
数组长度
也是数据类型的一部分
-
如果元素类型支持==、!=操作时,那么数组也支持此操作
package main import "fmt" func main() { var arr1 [3]int = [3]int{ 1, 3, 5} var arr2 [3]int = [3]int{ 1, 3, 5} var arr3 [3]int = [3]int{ 2, 4, 6} var arr4 [3]float64 = [3]float64{ 1.0, 3.0, 5.0} // 首先会判断`数据类型`是否相同,如果相同会依次取出数组中`对应索引的元素`进行比较, // 如果所有元素都相同返回true,否则返回false fmt.Println(arr1 == arr2) // true fmt.Println(arr1 == arr3) // false // fmt.Println(arr1 == arr4) // error }
- Go语言中的数组是值类型, 赋值和传参时会复制整个数组
package main import "fmt" func main() { var arr1 [3]int = [3]int{ 1, 3, 5} var arr2 [3]int = arr1 arr2[0] = 666 fmt.Println(arr1) // [1 3 5] fmt.Println(arr2) // [666 3 5] }
-
2、遍历
go语言,只支持for,故可以使用常规for循环进行遍历
但go提供了range来快速遍历,用法如下:
package array_test
import "testing"
func TestArrayTravel(t *testing.T) {
arr3 := [...]int{
1, 3, 4, 5}
for i := 0; i < len(arr3); i++ {
t.Log(arr3[i])
}
for idx, e := range arr3 {
// 表示索引,值,如果不需要索引或值,如何表示?
t.Log(idx, e)
}
for _, e := range arr3 {
// 如果不需要索引或值,使用_变量来表示,代表“占位”
t.Log(e)
}
}
3、数组(array)截取(切片,slice,切片初始化的一种方法)
a[开始索引(包含):结束索引(不包含)],左闭右开
如:a[2:len(a)]
go语言不支持负数截取,截取后的类型变为切片(slice,不是数组array)
package array_test
import "testing"
func TestArraySection(t *testing.T) {
arr3 := [...]int{
1, 2, 3, 4, 5}
t.