数组与切片go语言 数组的切片python( 三 )


Go语言中,切片是长度可变、容量固定的相同的元素序列 。Go语言的切片本质是一个数组 。容量固定是因为数组的长度是固定的 , 切片的容量即隐藏数组的长度 。长度可变指的是在数组长度的范围内可变 。
(1)切片的创建 。
切片的创建有4种方式:
1)make ( []Type ,length, capacity )
2)make ( []Type, length)
3) []Type{}
4) []Type{value1 , value2 , ... , valueN }
从3)、4)可见,创建切片跟创建数组唯一的区别在于 Type 前的“ [] ”中是否有数字 , 为空 , 则代表切片,否则则代表数组 。因为切片是长度可变的 。如下是创建切片的示例:
复制代码代码如下:
func test8() {
slice1 := make([]int32, 5, 8)
slice2 := make([]int32, 9)
slice3 := []int32{}
slice4 := []int32{1, 2, 3, 4, 5}
fmt.Println(slice1)
fmt.Println(slice2)
fmt.Println(slice3)
fmt.Println(slice4)
}
输出为:
[0 0 0 0 0]
[0 0 0 0 0 0 0 0 0]
[]
[1 2 3 4 5]
如上,创造了4个切片,3个空切片,一个有值的切片 。
(2)切片与隐藏数组:
一个切片是一个隐藏数组的引用,并且对于该切片的切片也引用同一个数组 。如下示例,创建了一个切片slice0,并根据这个切片创建了2个切片 slice1 和 slice2:
复制代码代码如下:
func test9() {
slice0 := []string{"a", "b", "c", "d", "e"}
slice1 := slice0[2 : len(slice0)-1]
slice2 := slice0[:3]
fmt.Println(slice0, slice1, slice2)
slice2[2] = "8"
fmt.Println(slice0, slice1, slice2)
}
输出为:
[a b c d e] [c d] [a b c]
[a b 8 d e] [8 d] [a b 8]
可见 , 切片slice0 、 slice1 和 slice2是同一个底层数组的引用,所以slice2改变了,其他两个都会变 。
(3)遍历、修改切片:
复制代码代码如下:
func test10() {
slice0 := []string{"a", "b", "c", "d", "e"}
fmt.Println("\n~~~~~~元素遍历~~~~~~")
for _, ele := range slice0 {
fmt.Print(ele, " ")
ele = "7"
}
fmt.Println("\n~~~~~~索引遍历~~~~~~")
for index := range slice0 {
fmt.Print(slice0[index], " ")
}
fmt.Println("\n~~~~~~元素索引共同使用~~~~~~")
for index, ele := range slice0 {
fmt.Print(ele, slice0[index], " ")
}
fmt.Println("\n~~~~~~修改~~~~~~")
for index := range slice0 {
slice0[index] = "9"
}
fmt.Println(slice0)
}
如上,前三种循环使用了不同的for range循环 , 当for后面,range前面有2个元素时,第一个元素代表索引 , 第二个元素代表元素值,使用 “_” 则表示忽略,因为go语言中,未使用的值会导致编译错误 。
只有一个元素时,该元素代表索引 。
只有用索引才能修改元素 。如在第一个遍历中 , 赋值ele为7 , 结果没有作用 。因为在元素遍历中 , ele是值传递,ele是该切片元素的副本,修改它不会影响原本值 , 而在第四个遍历——索引遍历中,修改的是该切片元素引用的值,所以可以修改 。
结果为:
~~~~~~元素遍历~~~~~~
a b c d e
~~~~~~索引遍历~~~~~~
a b c d e
~~~~~~元素索引共同使用~~~~~~
aa bb cc dd ee
~~~~~~修改~~~~~~
[9 9 9 9 9]
(4)、追加、复制切片:
复制代码代码如下:
func test11() {
slice := []int32{}
fmt.Printf("slice的长度为:%d,slice为:%v\n", len(slice), slice)
slice = append(slice, 12, 11, 10, 9)
fmt.Printf("追加后,slice的长度为:%d,slice为:%v\n", len(slice), slice)
slicecp := make([]int32, (len(slice)))

推荐阅读