slice 和 array

slice 和 array

array 在 golang 中比较少见,使用更多的是 slice,array 不同于 java,指的是定长的数组:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
func TestArray(t *testing.T) {
	arr := [10]int{1, 2, 3, 4, 5, 6, 9: 9}
	arr2 := [...]int{1, 2, 3}

	tmpType := reflect.TypeOf(arr)
	tmpStr := tmpType.String()
	t.Logf("tmpType %s", tmpStr)

	tmpType = reflect.TypeOf(arr2)
	tmpStr = tmpType.String()
	t.Logf("tmpType2 %s", tmpStr)

	t.Logf("arr %+v", arr)
	t.Logf("arr2 %+v", arr2)
}

对于 array,其长度是类型的一部分,上述代码的输出是:

1
2
3
4
5
6
=== RUN   TestArray
    array_test.go:14: tmpType [10]int
    array_test.go:18: tmpType2 [3]int
    array_test.go:20: arr [1 2 3 4 5 6 0 0 0 9]
    array_test.go:21: arr2 [1 2 3]
--- PASS: TestArray (0.00s)

除了直接赋值外,也可以使用 var 来声明,使用 var 是仅声明,初始化值为默认的 0 ,比如:

var arr [10]int

总结下,array 是定长的数组,且长度是类型的一部分,所以 [5]int 和 [6]int 类型是不一样的,array 初始化时可以用类似:index:value 的格式,这个表示 index 这个索引的值为 value,如果使用了这种格式,后续只能写 index+1 的值,举个例子:arr := […]int{1, 2, 4: 4, 5, 6, 7, 9: 9, 10} 表示这是一个长度为 10 的数组,且值为 1,2,0,0,4,5,6,7,0,9,10 4:4 表示 索引 4 的值为 4,它后面的 5 表示索引 5 的值为 5,如果需要跳着初始化这个功能也比较有用,比如 arr := […]int{1, 2, 9: 9} 则可以初始化 1,2,0,0,0,0,0,0,0,9

slice 是变长的数组,可以通过 append 来修改:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
func TestSlice(t *testing.T) {

	var slices1 []int

	for i := 1; i < 11; i++ {
		slices1 = append(slices1, i)
	}

	t.Logf("slices1 %+v", slices1)

	first := slices1[:4]
	second := slices1[5:]

	newSlices := append(first, second...)

	t.Logf("newSlices %+v", newSlices)
}

slice 切片只有 append,没有 delete remove 等方法,如果要删除元素,那么有两个办法:
1.通过 for 循环,将不需要删除的加入到新的 slice;
2.使用子切片的能力;比如 slices1 = slices1[1:] 这将删除第一个元素;
3.使用 slices.Delete(需要 golang 1.21 及以上版本)性能比 1、2 要更好;

最后更新于