4.2.1.索引和切分切片
一个切片是一个隐藏数组的引用,且切片的切片也是对同一个隐藏数组的引用。下面的例子可以解释这一点。
1 2 3 4 5 6 7 8 9 | s := []string{"A", "B", "C", "D", "E", "F", "G"} t := s[2:6] fmt.Println(t, s, "=", s[:4], "+", s[4:]) s[3] = "x" t[len(t)-1] = "y" fmt.Println(t, s, "=", s[:4], "+", s[4:]) [C D E F] [A B C D E F G] = [A B C D] + [E F G] [C x E y] [A B C x E y G] = [A B C x] + [E y G] |
当我们修改数据时,不管是通过原始切片s还是通过切片s的切片t,它们的底层数据都会被修改,所以这两个切片都会受到影响。上面的代码片段也说明,对于给定的切片s和索引位置i(0 ≤ i ≤ len(s)),s 等于s[:i] 和s[i:]的连接。在之前字符串引用那一章节我们介绍了类似的特性:
1 | s == s[:i]+s[i:] // s is a string; i is an int; 0 <= i <= len(s) |
图4.4展示了切片s,包括其所有的有效索引位置和上面代码片段中使用的切片。任何切片的第一个索引位置都是0,最后一个索引位置都是len(s)-1。
图4.4 切片剖析
与字符串不同的是,切片不支持+或+=操作符。尽管如此,切片的追加操作还是非常容易做到的,同时插入和删除元素也是很容易的,稍后我们会介绍到。