#Go中的切片
切片是一种类似于数组的数据结构,但其大小可变。
在底层,切片使用数组,并且它们是在数组之上构建的抽象,使它们更加灵活和有用(将数组视为较低级别)。
您将以与在高级语言中使用数组非常相似的方式使用切片。
您可以类似于数组定义一个切片,省略长度:
var mySlice []string //字符串切片
您可以使用值初始化切片:
var mySlice = []string{"First", "Second", "Third"}
//或者
mySlice := []string{"First", "Second", "Third"}
您可以使用make()
函数创建一个指定长度的空切片:
mySlice := make([]string, 3) //长度为3的空字符串切片
您可以从现有切片创建一个新的切片,并向其附加一个或多个项目:
mySlice := []string{"First", "Second", "Third"}
newSlice := append(mySlice, "Fourth", "Fifth")
请注意,我们需要将append()
的结果赋给一个新切片,否则会出现编译器错误。原始切片不会被修改,我们得到的是一个全新的切片。
您还可以使用copy()
函数复制一个切片,使其不与其他切片共享内存,并且是独立的:
mySlice := []string{"First", "Second", "Third"}
newSlice := make([]string, 3)
copy(newSlice, mySlice)
如果要复制到的切片没有足够的空间(比原始切片短),则仅复制第一个项目(直到有空间为止)。
您可以从数组初始化一个切片:
myArray := [3]string{"First", "Second", "Third"}
mySlice = myArray[:]
多个切片可以使用同一数组作为底层数组:
myArray := [3]string{"First", "Second", "Third"}
mySlice := myArray[:]
mySlice2 := myArray[:]
mySlice[0] = "test"
fmt.Println(mySlice2[0]) //"test"
这两个切片现在共享相同的内存,修改一个切片会修改底层数组并导致从数组生成的另一个切片也被修改。
与数组一样,切片中的每个项存储在连续的内存位置中。
如果您知道需要对切片执行操作,可以要求其具有比所需空间更多的容量,以便当您需要更多空间时,空间将立即可用(而不是在新内存位置上查找并移动切片以提供更多空间,并通过旧位置的垃圾收集器处理)。
我们可以通过将第三个参数添加到make()
函数中来指定容量:
newSlice := make([]string, 0, 10)
//容量为10的空切片
与字符串一样,您可以通过以下语法获取切片的一部分:
mySlice := []string{"First", "Second", "Third"}
newSlice := mySlice[:2] //获取前2个项目
newSlice2 := mySlice[2:] //忽略前2个项目
newSlice3 := mySlice[1:3] //位置1-2的新切片