Go:slice
一、切片创建方式
func main() { // 创建切片方式1 // 让切片引用一个数组 array := [...]int{1, 2, 3, 4} slice1 := array[1:3] fmt.Println(slice1) // [2 3] // 创建切片方式2 // 通过make方式创建切片 var slice2 []int // 这是切片定义,需要让其引用一个数组,或make一下才能使用!!! slice2 = make([]int, 4) fmt.Println(slice2) // [0 0 0 0] var slice3 = make([]int, 4, 8) // 8为容量(cap),可选 fmt.Println(slice3) // [0 0 0 0] slice4 := make([]string, 4) fmt.Println(slice4) // [ ] fmt.Println(cap(slice4)) // 4 // 创建切片方式3 // 定义一个切片,直接就指定具体数组,原理类似make方式 var slice5 = []float64{1.11, 2.22, 3.33} slice6 := []string{"a", "b"} fmt.Printf("%.1f\n", slice5) // [1.1 2.2 3.3] fmt.Println(slice6) // [a b] }
方式1与方式2的区别:
- 方式1是直接引用数组,这个数组是事先存在的,程序员是可操作的;
- 方式2是通过make来创建切片,make会创建一个数组,而切片就是引用这个数组,这个数组是由切片在底层进行维护,程序员不可操作。
二、切片的添加操作
func main() { slice := []string{"a", "b"} fmt.Println(slice) // [a b] slice = append(slice, "c", "d") fmt.Println(slice) // [a b c d] slice = append(slice, slice...) fmt.Println(slice) // [a b c d a b c d] }
三、切片的拷贝操作
# 参数的数据类型都是切片 copy(param1, param2)
func main() { slice1 := []int{1, 2, 3} slice2 := make([]int, 5) slice3 := make([]int, 2) copy(slice2, slice1) fmt.Println(slice2) // [1 2 3 0 0] copy(slice3, slice1) fmt.Println(slice3) // [1 2] }
四、string与slice关系
string底层是一个byte数组,因此string也可以进行切片操作(这里不演示)。
string是不可变的,因此不能通过 str[0] = 'xx' 方式来修改字符串;如果需要修改字符串,可以先将 string 转成 []byte 或者 []rune 类型,修改后再转回。
func main() { str := "Hello" sli := []byte(str) sli[0] = 'h' fmt.Println(sli) // [104 101 108 108 111] str = string(sli) fmt.Println(str) // hello // 推荐使用下面方式(支持中文) s := []rune(str) s[0] = '吖' str = string(s) fmt.Println(str) // 吖ello }