Menu
×
   ❮   
HTML CSS JAVASCRIPT SQL PYTHON JAVA PHP HOW TO W3.CSS C C++ C# BOOTSTRAP REACT MYSQL JQUERY EXCEL XML DJANGO NUMPY PANDAS NODEJS R TYPESCRIPT ANGULAR GIT POSTGRESQL MONGODB ASP AI GO KOTLIN SASS VUE DSA GEN AI SCIPY AWS CYBERSECURITY DATA SCIENCE
     ❯   

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() 函数将元素追加到切片的末尾

语法

切片名称 = append(切片名称, 元素 1, 元素 2, ...)

示例

此示例演示如何向切片末尾追加元素

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() 函数

语法

切片 3 = append(切片 1, 切片 2...)

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

示例

此示例演示如何将一个切片追加到另一个切片

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() 函数复制这些元素。

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

语法

copy(目标, )

The copy() 函数接收两个切片 目标,并将数据从 复制到 目标。它返回已复制的元素数。

示例

此示例演示如何使用 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
尝试一下 »

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


×

Contact Sales

If you want to use W3Schools services as an educational institution, team or enterprise, send us an e-mail:
[email protected]

Report Error

If you want to report an error, or if you want to make a suggestion, send us an e-mail:
[email protected]

W3Schools is optimized for learning and training. Examples might be simplified to improve reading and learning. Tutorials, references, and examples are constantly reviewed to avoid errors, but we cannot warrant full correctness of all content. While using W3Schools, you agree to have read and accepted our terms of use, cookie and privacy policy.

Copyright 1999-2024 by Refsnes Data. All Rights Reserved. W3Schools is Powered by W3.CSS.