第四章 go语言 数组、切片和映射 (2)

Go语言提供的内置函数make()可以用于灵活的创建数组切片。make()函数创建一个指定元素类型、长度和容量的slice。容量部分可以省略,在这种情况下,容量将等于长度。在底层,make创建了一个匿名的数组变量,然后返回一个slice。只有通过返回的slice才能引用匿名的数组变量。

make([]T,len)

make([]T,len,cap)

 

内置的len()函数获取长度,内置的cap()函数获取容量。

slice1 := make([]int, 5)

slice2 := make([]int, 5, 10)

slice3 := []int{1, 2, 3, 4, 5}

fmt.Println(slice1, len(slice1), cap(slice1))

fmt.Println(slice2, len(slice2), cap(slice2))

fmt.Println(slice3, len(slice3), cap(slice3))

打印结果:

[0 0 0 0 0] 5 5

[0 0 0 0 0] 5 10

[1 2 3 4 5] 5 5

 

与数组相同,slice操作不能超出len指定的范围。

slice := make([]int, 5, 10)

slice[3] = 10 //正确

slice[8] = 8 //错误 ,索引超出范围

 

 

 

4 切片的遍历

切片的遍历与数组的遍历方式相同。

5 切片不能比较

与数组不同的是slice之间不能比较,因此我们不能使用==操作符来判断两个slice是否含有全部相等的元素。不过标准库提供了高度优化的bytes.Equal函数两个字节型slice是否相等,但是对于其它类型的slice,我们必须自己展开每个元素进行比较。

切片可遍历,可修改,不可比较

6 判断切片是否为空

使用len(s)==0来判断一个slice是否为空。

7 追加元素

内置的append函数用于向slice追加元素。可以直接追加元素,也可以追加一个slice。注意参数slice后有...。否则有语法错误。因为append()函数的语义是从第二个参数开始都应该是待附加的元素。slice后加...意味将slice的元素全部打散后传入。数组切片会自动处理存储空间不足的问题。如果追加的内容长度超过当前已分配的存储空间(即cap()调用返回的信息),数组切片会自动分配一块足够大的内存。 

slice := make([]int, 5, 10)

slice = append(slice, 1, 2, 3)

fmt.Println(slice)

slice2 := []int{4, 5, 6}

slice = append(slice, slice2...)

fmt.Println(slice)

打印结果:

[0 0 0 0 0 1 2 3]

[0 0 0 0 0 1 2 3 4 5 6]

 

 

8 切片复制

内置的copy函数用于数组切片的复制。复制时无需考虑目标数组和源数组的长度。

slice1 := []int{1, 2, 3, 4, 5}

slice2 := []int{7, 8, 9}

copy(slice2, slice1) //只会将slice1的前3个元素赋值给slice2

fmt.Println(slice2)

slice3 := []int{1, 2, 3, 4, 5}

slice4 := []int{7, 8, 9}

copy(slice3, slice4) //将slice4的元素赋值slice3的前3个元素

fmt.Println(slice3)

打印结果:

[1 2 3]

[7 8 9 4 5]

 

9 作为函数参数时切片与数组的区别

func SetValueByArray(arr [5]int) {

    arr[0] = 100

}

 

func SetValueBySlice(slice []int) {

    slice[0] = 100

}

func main() {

    arr := [5]int{1, 2, 3, 4, 5}

    SetValueByArray(arr)

    fmt.Println(arr)  

    slice := arr[:]

    SetValueBySlice(slice)

    fmt.Println(arr)

}

//打印结果:

[1 2 3 4 5]

[100 2 3 4 5]

 

 

10字符串和byte切片

标准库中提供了4个与字符串操作相关的包:

 

功能

 

strings

 

提供了字符串查询、替换、比较、截断、拆分和合并等功能。

 

bytes

 

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wsxdzw.html