Go - Slice(切片)

Go - Slice(切片) 首页 / Golang入门教程 / Go - Slice(切片)

Go Slice是Go Array的抽象,Go Array数组允许您定义可容纳相同种类的变量,但是它不提供任何内置方法来动态增加其大小或获取其自身的子数组。Slice切片克服了此限制,它提供了Array数组所需的许多实用程序功能,并广泛用于Go编程中。

定义切片

要定义Slice切片,可以将其声明为数组,而无需指定其大小,另外,您可以使用 make 函数创建切片。

var numbers []int /* 一块未指定大小的切片 */
/* numbers == []int{0,0,0,0,0}*/
numbers=make([]int,5,5) /* 长度为 5、容量为 5 的切片*/

len和cap函数

Slice切片是对数组的抽象,它实际上使用数组作为基础结构, len()函数返回切片中存在的元素,而 cap()函数返回切片的容量。

package main

import "fmt"

func main() {
   var numbers=make([]int,3,5)
   printSlice(numbers)
}
func printSlice(x []int){
   fmt.Printf("len=%d cap=%d slice=%v\n",len(x),cap(x),x)
}

编译并执行上述代码后,将产生以下输出-

len=3 cap=5 slice=[0 0 0]

Nil

如果声明没有任何输入的切片,则默认情况下将其初始化为nil,它的长度len和容量cap为零。如-

package main

import "fmt"

func main() {
   var numbers []int
   printSlice(numbers)
   
   if(numbers == nil){
      fmt.Printf("slice is nil")
   }
}
func printSlice(x []int){
   fmt.Printf("len=%d cap=%d slice=%v\n", len(x), cap(x),x)
}

编译并执行上述代码后,将产生以下输出-

len=0 cap=0 slice=[]
slice is nil

子切片

Slice允许使用 [lower-bound:upper-bound] 指定下限和上限,以获取其子切片。如-

package main

import "fmt"

func main() {
   /* 创建切片 */
   numbers := []int{0,1,2,3,4,5,6,7,8}   
   printSlice(numbers)
   
   /* 打印原始切片 */
   fmt.Println("numbers ==", numbers)
   
   /* 打印从索引 1(包括)到索引 4(不包括)的子切片 */
   fmt.Println("numbers[1:4] ==", numbers[1:4])
   
   /* 缺少下限意味着 0 */
   fmt.Println("numbers[:3] ==", numbers[:3])
   
   /* 缺少上限意味着 len(s) */
   fmt.Println("numbers[4:] ==", numbers[4:])
   
   numbers1 := make([]int,0,5)
   printSlice(numbers1)
   
   /* 打印从索引 0(包括)到索引 2(不包括)的子切片 */
   number2 := numbers[:2]
   printSlice(number2)
   
   /* 打印从索引 2(包括)到索引 5(不包括)的子切片 */
   number3 := numbers[2:5]
   printSlice(number3)
   
}
func printSlice(x []int){
   fmt.Printf("len=%d cap=%d slice=%v\n", len(x), cap(x),x)
}

编译并执行上述代码后,将产生以下输出-

len=9 cap=9 slice=[0 1 2 3 4 5 6 7 8]
numbers == [0 1 2 3 4 5 6 7 8]
numbers[1:4] == [1 2 3]
numbers[:3] == [0 1 2]
numbers[4:] == [4 5 6 7 8]
len=0 cap=5 slice=[]
len=2 cap=9  slice=[0 1]
len=3 cap=7 slice=[2 3 4]

append和copy函数

使用 append()函数可以增加切片的容量,使用 copy()函数,将源切片的内容复制到目标切片。如-

package main

import "fmt"

func main() {
   var numbers []int
   printSlice(numbers)
   
   /* append 允许 nil 切片 */
   numbers=append(numbers, 0)
   printSlice(numbers)
   
   /* 向切片添加一个元素 */
   numbers=append(numbers, 1)
   printSlice(numbers)
   
   /* 一次添加多个元素 */
   numbers=append(numbers, 2,3,4)
   printSlice(numbers)
   
   /* 创建一个切片 numbers1,其容量是先前切片的两倍 */
   numbers1 := make([]int, len(numbers), (cap(numbers))*2)
   
   /* 将数字的内容复制到 numbers1 */
   copy(numbers1,numbers)
   printSlice(numbers1)   
}
func printSlice(x []int){
   fmt.Printf("len=%d cap=%d slice=%v\n",len(x),cap(x),x)
}

编译并执行上述代码后,将产生以下输出-

len=0 cap=0 slice=[]
len=1 cap=2 slice=[0]
len=2 cap=2 slice=[0 1]
len=5 cap=8 slice=[0 1 2 3 4]
len=5 cap=16 slice=[0 1 2 3 4]

祝学习愉快!(内容编辑有误?请选中要编辑内容 -> 右键 -> 修改 -> 提交!)

技术教程推荐

玩转Git三剑客 -〔苏玲〕

Vue开发实战 -〔唐金州〕

Swift核心技术与实战 -〔张杰〕

JavaScript核心原理解析 -〔周爱民〕

深入浅出云计算 -〔何恺铎〕

人人都用得上的写作课 -〔涵柏〕

如何读懂一首诗 -〔王天博〕

结构学习力 -〔李忠秋〕

手把手带你写一个 MiniTomcat -〔郭屹〕

好记忆不如烂笔头。留下您的足迹吧 :)