Go 访问、修改、添加和复制切片

访问切片的元素

您可以通过引用索引号来访问特定的切片元素。

在 Go 中,索引从 0 开始。这意味着 [0] 是第一个元素,[1] 是第二个元素,依此类推。

实例

此例展示了如何访问 prices 切片中的第一个和第三个元素:

package main
import ("fmt")

func main() {
  prices := []int{10,20,30}

  fmt.Println(prices[0])
  fmt.Println(prices[2])
}

结果:

10
30

亲自试一试

修改切片的元素

你也可以通过引用索引号来修改特定的切片元素。

实例

此例展示了如何修改 prices 切片中的第三个元素:

package main
import ("fmt")

func main() {
  prices := []int{10,20,30}
  prices[2] = 50
  fmt.Println(prices[0])
  fmt.Println(prices[2])
}

结果:

10
50

亲自试一试

向切片添加元素

你可以使用 append() 函数将元素添加到切片的末尾:

语法

slice_name = append(slice_name, element1, element2, ...)

实例

此例展示了如何将元素添加到切片的末尾:

package main
import ("fmt")

func main() {
  myslice1 := []int{1, 2, 3, 4, 5, 6}
  fmt.Printf("myslice1 = %v\n", myslice1)
  fmt.Printf("length = %d\n", len(myslice1))
  fmt.Printf("capacity = %d\n", cap(myslice1))

  myslice1 = append(myslice1, 20, 21)
  fmt.Printf("myslice1 = %v\n", myslice1)
  fmt.Printf("length = %d\n", len(myslice1))
  fmt.Printf("capacity = %d\n", cap(myslice1))
}

结果:

myslice1 = [1 2 3 4 5 6]
length = 6
capacity = 6
myslice1 = [1 2 3 4 5 6 20 21]
length = 8
capacity = 12

亲自试一试

将一个切片追加到另一个切片

要将一个切片的所有元素追加到另一个切片,请使用 append()/ 函数:

语法

slice3 = append(slice1, slice2...)

注意:在将一个切片的元素追加到另一个切片时,slice2 后的 '...' 是必需的

实例

此例展示了如何将一个切片追加到另一个切片:

package main
import ("fmt")

func main() {
  myslice1 := []int{1,2,3}
  myslice2 := []int{4,5,6}
  myslice3 := append(myslice1, myslice2...)

  fmt.Printf("myslice3=%v\n", myslice3)
  fmt.Printf("length=%d\n", len(myslice3))
  fmt.Printf("capacity=%d\n", cap(myslice3))
}

结果:

myslice3=[1 2 3 4 5 6]
length=6
capacity=6

亲自试一试

更改切片的长度

与数组不同,切片的长度是可变的。

实例

此例展示了如何更改切片的长度:

package main  
import ("fmt")  
  
func main() {  
  arr1 := [6]int{9, 10, 11, 12, 13, 14} // 一个数组  
  myslice1 := arr1[1:5] // 切片数组  
  fmt.Printf("myslice1 = %v\n", myslice1)  
  fmt.Printf("length = %d\n", len(myslice1))  
  fmt.Printf("capacity = %d\n", cap(myslice1))  
  
  myslice1 = arr1[1:3] // 通过重新切片数组来改变长度  
  fmt.Printf("myslice1 = %v\n", myslice1)  
  fmt.Printf("length = %d\n", len(myslice1))  
  fmt.Printf("capacity = %d\n", cap(myslice1))  
  
  myslice1 = append(myslice1, 20, 21, 22, 23) // 通过添加项目来改变长度  
  fmt.Printf("myslice1 = %v\n", myslice1)  
  fmt.Printf("length = %d\n", len(myslice1))  
  fmt.Printf("capacity = %d\n", cap(myslice1))  
}

结果:

myslice1 = [10 11 12 13]
length = 4
capacity = 5
myslice1 = [10 11]
length = 2
capacity = 5
myslice1 = [10 11 20 21 22 23]
length = 6
capacity = 10

亲自试一试

内存效率

当使用切片时,Go 会将所有底层元素加载到内存中。

如果数组很大,而你只需要几个元素,那么最好使用 copy() 函数来复制这些元素。

copy() 函数会创建一个新的底层数组,其中仅包含切片所需的元素。这将减少程序使用的内存。

语法

copy(dest, src)

copy() 函数采用两个切片 destsrc,并将数据从 src 复制到 dest。它返回复制的元素数。

实例

此例展示了如何使用 copy() 函数:

package main  
import ("fmt")  
  
func main() {  
  numbers := []int{1,2,3,4,5,6,7,8,9,10,11,12,13,14,15}  
  // 原始切片  
  fmt.Printf("numbers = %v\n", numbers)  
  fmt.Printf("length = %d\n", len(numbers))  
  fmt.Printf("capacity = %d\n", cap(numbers))  
  
  // 仅使用所需数字创建副本  
  neededNumbers := numbers[:len(numbers)-10]  
  numbersCopy := make([]int, len(neededNumbers))  
  copy(numbersCopy, neededNumbers)  
  
  fmt.Printf("numbersCopy = %v\n", numbersCopy)  
  fmt.Printf("length = %d\n", len(numbersCopy))  
  fmt.Printf("capacity = %d\n", cap(numbersCopy))  
}

结果:

// 原始切片  
numbers = [1 2 3 4 5 6 7 8 9 10 11 12 13 14 15]  
length = 15  
capacity = 15  
// 新切片  
numbersCopy = [1 2 3 4 5]  
length = 5  
capacity = 5

亲自试一试

新切片的容量现在小于原始切片的容量,因为新的底层数组较小。