侧边栏壁纸
博主头像
秋码记录

一个游离于山间之上的Java爱好者 | A Java lover living in the mountains

  • 累计撰写 29 篇文章
  • 累计创建 40 个标签
  • 累计创建 185 个分类

Go 语言中的数组(Let's Go 十二)

其实啊,切片就好像一个完整的蛋糕,你用刀切了一小块,而这一块就是从那完整的蛋糕切了下来。

1、生成切片

首先,需要了解的是,到底什么是切片呢?

其实啊,切片就好像一个完整的蛋糕,你用刀切了一小块,而这一块就是从那完整的蛋糕切了下来。

切片是对数组的某一个连续片段的引用,当然咯,这个片段也可以是整个数组。

slice [start : end]
//slice:  目标切片对象
//start: 目标切片对象的开始索引
//end:   目标切片对象的结束索引

需要注意的是,切片内不包括结束索引所指向的项

package main

import "fmt"

func main() {

    siteConf := [...]string{"秋码记录", "https://qiucode.cn", "秋码淘好货"}

    fmt.Println(siteConf, siteConf[1:2])
}

img

1.1、指定范围生成切片

package main

import "fmt"

func main() {

    var arr [30]int
    for i := 0; i < 30; i++ {
        arr[i] = i + 1
    }
    // 区间
    fmt.Println(arr[10:15])
    // 中间到尾部的所有元素
    fmt.Println(arr[20:])
    // 开头到中间指定位置的所有元素
    fmt.Println(arr[:2])
}

img

1.2、原切片

开始索引结束索引都被忽略时,生成的切片与没有生成的对象一致。

package main

import "fmt"

func main() {

    a := []int{1, 2, 3}
    fmt.Println(a, a[:])
}

img

1.3、空切片

若将开始索引结束索引都设为0的话,那么将会生成空切片

package main

import "fmt"

func main() {

    a := []int{1, 2, 3}
    fmt.Println(a, a[0:0])
}

img

2、声明切片

除了可以从数组或切片中生成切片外,还可以声明一个新的切片,其声明与数组声明方式很相似。

var name []Type
//name:切片的变量名称
//Type: 切片的元素类型

img

代码说明如下:

  • 第 8 行,声明一个字符串切片,切片中拥有多个字符串。
  • 第 10 行,声明一个整型切片,切片中拥有多个整型数值。
  • 第 12 行,将 numListEmpty 声明为一个整型切片,本来会在{}中填充切片的初始化元素,这里没有填充,所以切片是空的,但是此时的 numListEmpty 已经被分配了内存,只是还没有元素。
  • 第 14 行,切片均没有任何元素,3 个切片输出元素内容均为空。
  • 第 16 行,没有对切片进行任何操作,strList 和 numList 没有指向任何数组或者其他切片。
  • 第 18 行和第 19 行,声明但未使用的切片的默认值是 nilstrListnumList 也是 nil,所以和 nil 比较的结果是 true
  • 第 20 行,numListEmpty 已经被分配到了内存,但没有元素,因此和 nil 比较时是 false

切片是动态结构,只能与 nil 判定相等,不能互相判定相等。声明新的切片后,可以使用 append() 函数向切片中添加元素。

3、make() 函数构造切片


make([]Type, size, cap)

其中Type 是指切片的元素类型,size 指的是为这个类型分配多少个元素,cap 为预分配的元素数量,这个值设定后不影响 size,只是能提前分配空间,降低多次分配空间造成的性能问题。

package main

import "fmt"

func main() {

    a := make([]int, 3)
    b := make([]int, 3, 15)

    fmt.Println(a, b)
    fmt.Println(len(a), len(b))
}

img