首页 > 其他分享 >无涯教程-Go - Slice(切片)

无涯教程-Go - Slice(切片)

时间:2023-12-20 13:31:26浏览次数:35  
标签:Slice printSlice cap 无涯 len 切片 slice numbers Go

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]

参考链接

https://www.learnfk.com/go/go-slice.html

标签:Slice,printSlice,cap,无涯,len,切片,slice,numbers,Go
From: https://blog.51cto.com/u_14033984/8906871

相关文章

  • ReplaceGoogleCDN替换打不开的网页资源
    插件安装地址:ChromeFirefoxEdge背景在日常的网络浏览中,我们经常访问各种网站,其中包括大量使用了GoogleCDN(ContentDeliveryNetwork)的网页。虽然GoogleCDN在提供稳定、高效的内容分发方面表现出色,但在某些情况下,由于网络限制或其他原因,我们可能会遇到加载缓慢或无法访......
  • Why Choose Noregon JPRO Professional Diagnostic 2023 v3 Software?
     Welcometotheworldofautomotivediagnostics,whereprecisionmeetsefficiency.WiththeNoregonJPROProfessionalDiagnostic2023v3software,mechanics,technicians,andautomotiveenthusiastscanrevolutionizethewaytheyapproachvehiclediagnost......
  • MongoDB中如何优雅地删除大量数据
    删除大量数据,无论是在哪种数据库中,都是一个普遍性的需求。除了正常的业务需求,我们也需要通过这种方式来为数据库“瘦身”。为什么要“瘦身”呢?表的数据量到达一定量级后,数据量越大,表的查询性能相对也会越差。毕竟数据量越大,B+树的层级会越高,需要的IO也会越多。表的数据有......
  • 无涯教程-Go - 作用域
    任何编程中的作用域是程序中可以存在定义的变量并且不能访问该变量的区域,在三个地方可以使用Go编程语言声明变量-在函数或块内(local变量)所有函数之外(global变量)在函数参数中(formal参数)让我们找出什么是local和global变量以及什么是formal参数。局部变量在......
  • ArgoCD 添加私有仓库
    HTTPS方式访问私有仓库ArgoCDCLI添加私有仓库#argocdrepoaddhttps://github.com/argoproj/argocd-example-apps--username<username>--password<password>dashboard添加私有仓库SSHPrivateKeyCredentialArgoCDCLI添加known_hosts#ssh-keyscan-p3......
  • 无涯教程-Go - 常量类型
    常量是指程序在执行过程中不得更改的固定值。整数类型整数文字可以是十进制,八进制或十六进制常量,前缀指定基数或基数:十六进制为0x或0X,八进制为0,十进制为空。整数文字也可以具有后缀,该后缀是U和L的组合,分别表示无符号和长整数,后缀可以是大写或小写,并且可以是任何顺序。212......
  • GoFrame Goland插件
    前言GoFrame是一款模块化、高性能、企业级的Go基础开发框架。GoFrame是一款通用性的基础开发框架,是Golang标准库的一个增强扩展级,包含通用核心的基础开发组件,优点是实战化、模块化、文档全面、模块丰富、易用性高、通用性强、面向团队。GoFrame既可用于开发完整的工程化项......
  • 数据备份软件GoodSync
    为什么需要数据备份软件?重要的数据无价,而一块机械硬盘的理论使用寿命是5-10年。一块盘里的数据更改,希望能及时、正确,备份到另外一块硬盘里。只想备份更改,不想全盘备份。毕竟有的情况下会有动辄几十TB的数据。那能不能使用云服务?免费云服务的速度并不理想。部分资源可能会......
  • 无涯教程-Java - 线程控制函数
    核心Java提供了对多线程程序的完全控制,您可以开发一个多线程程序,该程序可以根据您的要求完全挂起,恢复或停止。您可以对线程对象使用各种静态方法来控制其行为。下表列出了这些方法-Sr.No.Method&Remark1publicvoidsuspend()该方法将线程置于挂起状态,可以使用resume()......
  • golang快速入门:结构体
    结构体Go语言的面向对象编程与我们之前所熟悉的PHP、Java那一套完全不同,没有 class、extends、implements 之类的关键字和相应的概念,而是借助结构体来实现类的声明。typePersonstruct{namestring//名字malebool//性别}可以理解为类名 Person,并且包含了 ......