Go语言切片初识

Go切片(Slice)是Go数组的一个抽象。 由于Go数组允许定义类型的变量,可以容纳相同数据类型的几个数据项,但它不提供任何内置的方法来动态增加其大小或获取自己的子数组。切片就没有这样的限制。 它提供了数组所需的许多实用功能,并广泛用于Go编程。

定义切片

    var numbers []int /* 未指定大小 */
    /* numbers == []int{0,0,0,0,0}*/
    numbers = make([]int,6,6) /* 长度是6容量是6的切片*/

len() 和 cap()函数

因为切片(Slice)是数组上的抽象。 它实际上使用数组作为底层结构体.len()函数返回切片中存在的元素数量,其中cap()函数返回切片(Slice)的容量(大小),即可容纳多少个元素。 以下是解释切片(Slice)的用法的示例:

    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。 其长度和容量为零。 以下是一个示例:

        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)允许指定下界和上界,以使用[下限:上限]获取它的子切片。 以下是示例:

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

切片(Slice)允许使用append()函数增加切片的容量(大小)。使用copy()函数,将源切片的内容复制到目标切片。以下是示例:

        package main        
        
        import "fmt"
        
        func main() {
           var numbers []int
           printSlice(numbers)
        
           /* 添加空元素到切片 */
           numbers = append(numbers, 0)
           printSlice(numbers)
        
           /* 添加一个元素到切片*/
           numbers = append(numbers, 1)
           printSlice(numbers)
        
           /* 添加多个元素*/
           numbers = append(numbers, 2,3,4)
           printSlice(numbers)
        
           /* 新建一个切片,容量增加到原来的两倍*/
           numbers1 := make([]int, len(numbers), (cap(numbers))*2)
        
           /* 拷贝 numbers 到 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]
时间: 2024-12-29 07:06:06

Go语言切片初识的相关文章

GO语言 切片 map 字符串

切片 1.什么是切片 切片本身不拥有任何数据,它们只是对现有数组的引用. 2.切片的定义 1.方式1:由数组切出来:var 变量名 []元素类型 = 数组名[开始值:结束值] //1.定义数组 var a [8]int=[8]int{1,2,3,4,5,6,7,8} //2.定义切片,注意[]中没有数字 var b []int=a[2:6] fmt.Println(b) // [3 4 5 6] //更多用法,没有步长 var a [8]int=[8]int{1,2,3,4,5,6,7,8} b

go语言切片作为函数参数的研究

slice作为函数参数是值传递 golang中的切片slice底层通过数组实现,slice类似一个结构体,其中一个字段保存的是底层数组的地址,还有长度(len) 和 容量(cap)两个字段. 结构体作为函数参数时是值拷贝,同理,实际上slice作为函数参数时也是值拷贝,在函数中对slice的修改是通过slice中保存的地址对底层数组进行修改,所以函数外的silce看起来被改变了. 当需要对slice做插入和删除时,由于需要更改长度字段,值拷贝就不行了,需要传slice本身在内存中的地址. 以删除

C语言指针初识

定义指针变量 定义指针变量,在变量名前面加星号*,格式为: int a; datatype *pointname; int *p; p = &a; 或者 int a; datatype *pointname = value; int *p = &a; 定义指针变量时必须带*,给指针变量赋地址值时不能带*,等于一个地址即可改变指针指向. 1 //定义普通变量 2 float a = 99.5, b = 10.6; 3 char c = '@', d = '#'; 4 //定义指针变量 5 f

初识 go 语言:方法,接口及并发

目录 方法,接口及并发 方法 接口 并发 信道 结束语 前言: go语言的第四篇文章,主要讲述go语言中的方法,包括指针,结构体,数组,切片,映射,函数闭包等,每个都提供了示例,可直接运行. 方法,接口及并发 方法 方法就是一类带特殊的接收者(struct)参数的函数 通过 结构体.方法 调用 示例: type city struct { name, address string } func (c city) sysCity() { c.name = "帝都" fmt.Println

Go语言的切片

Go 语言切片(Slice) Go 语言切片是对数组的抽象. Go 数组的长度不可改变,在特定场景中这样的集合就不太适用,Go中提供了一种灵活,功能强悍的内置类型切片("动态数组"),与数组相比切片的长度是不固定的,可以追加元素,在追加时可能使切片的容量增大. 定义切片 你可以声明一个未指定大小的数组来定义切片: var identifier []type 切片不需要说明长度. 或使用make()函数来创建切片: var slice1 = make([] type, len) 或者写成

go语言基础教程

Go 是一个开源的编程语言,它能让构造简单.可靠且高效的软件变得容易. Go是从2007年末由Robert Griesemer, Rob Pike, Ken Thompson主持开发,后来还加入了Ian Lance Taylor, Russ Cox等人,并最终于2009年11月开源,在2012年早些时候发布了Go 1稳定版本.现在Go的开发已经是完全开放的,并且拥有一个活跃的社区. Go 语言环境安装 Go 语言支持以下系统: Linux FreeBSD Mac OS X(也称为 Darwin)

Go语言基础(二)-----高级数据类型

Go语言-数组类型 一个数组(Array)就是一个可以容纳若干类型相同的元素的容器.这个容器的大小(即数组的长度)是固定的,且是体现在数组的类型字面量之中的.比如,我们声明了一个数组类型: type MyNumbers [3]int 注:类型声明语句由关键字type.类型名称和类型字面量组成. 所谓类型字面量,就是用于表示某个类型的字面表示(或称标记方法).相对的,用于表示某个类型的值的字面表示可被称为值字面量,或简称为字面量.比如之前提到过的3.7E-2就可被称为浮点数字面量. 类型字面量[3

Go语言基础介绍

Go是一个开源的编程语言.Go语言被设计成一门应用于搭载Web服务器,存储集群或类似用途的巨型中央服务器的系统编程语言.目前,Go最新发布版本为1.10. Go语言可以运行在Linux.FreeBSD.Mac OS X和Windows系统上. 1. 结构:Go语言的基础组成有以下几个部分:包声明.引入包.函数.变量.语句&表达式.注释. (1).必须在源文件中非注释的第一行指明这个文件属于哪个包,如:package main (2).注释与C++相同,有单行注释即"//"和多行

Go语言开发(三)、Go语言内置容器

Go语言开发(三).Go语言内置容器 一.Go语言数组 1.Go语言数组简介 Go语言提供了数组类型的数据结构.数组是具有相同唯一类型的一组已编号且长度固定的数据项序列,类型可以是任意的原始类型例如×××.字符串或者自定义类型.相对于去声明number0, number1, ..., and number99的变量,使用数组形式numbers[0], numbers[1] ..., numbers[99]更加方便且易于扩展.数组元素可以通过索引(位置)来读取(或者修改),索引从0开始,第一个元素