go语言切片(slice)

Go / 452人浏览 / 0人评论

go语言提供了一种功能强悍的类型:切片(动态数组),切片不是固定的,他是围绕数组进行的封装,你能够在切片中动态添加元素,所以切片的容量也会增加,定义的时候就开辟了内存空间。

go语言切片(slice)

go语言数组(array)

go语言中数组(array)(数组就是一种数据集合)的长度是固定的,不可以改变,所以你想实现不固定的长度数组,go语言提供了强悍的切片功能。

什么是go语言切片(slice)?

go语言切片(slice)的结构是什么?

go语言提供了一种功能强悍的类型:切片(动态数组),切片不是固定的,他是围绕数组进行的封装,你能够在切片中动态添加元素,所以切片的容量也会增加,定义的时候就开辟了内存空间。

go语言定义切片(slice)方式一

定义切片首选需要声明一个没有指定大小的数组(array)来定义切片。

var identifier(标识符) []type(类型)

go语言定义切片(slice)方式二

使用make()函数来创建切片,有三个参数, 第一个是我们分配的类型,第二个是类型的“长度”,第三个是类型的“容量”(这个参数是可选的)。

var identifier(标识符) []type(类型) = make([]type(类型), len(长度), capacity(容量))

简写方式

identifier(标识符) := make([]type(类型), len(长度))

长度和容量关系

在往切片中追加的数据个数大于容量的时候,容量如果不够了,会在内部自动扩容,扩容为当前长度的两倍。

当容量超过1024时,每次扩容则只增加当前容量的四分之一。

切片示例代码

// 创建切片
var numbers []int

// 创建切片
var numbers_one = []int{123,456,789}

// 简写创建切片
numbers_two := []int{123,456,789}

// make创建切片
var usernames = make([]int, 3, 8)

容易混淆概念

创建切片的指针类型

var names = new([]int)

特点:容量,长度都为0,数据为空,定义的时候就开辟了内存空间,可通过&names获取内存地址。

指针类型指向的是内存地址,存储的是切片的数据内存地址。

声明指针类型,不做初始化,不开辟内存空间,创建了一个指针,指向了一个空值nil。

var ages *[]int

go切片定义示例

var price = make([]float, 2.56, 5.66)

fmt.Println(len(price), cap(price)) // 获取输入长度和容量

// 如果以下面的方式创建切片,长度为:5,容量为:5,值为int的初始值(存储了三个0)
data := make([]int, 5)

示例代码

package main

import "fmt"

func main() {
    var numbers []int

    var numbers_one = []int{123, 456, 789}

    numbers_two := []int{123, 456, 789}

    var usernames = make([]int, 3, 8)

    var names = new([]int)

    var ages *[]int

    var price = make([]float32, 2, 10)

    data := make([]int, 5)

    fmt.Println(numbers)
    fmt.Println(numbers_one)
    fmt.Println(numbers_two)
    fmt.Println(usernames)
    fmt.Println(names)
    fmt.Println(ages)
    fmt.Println(len(price), cap(price)) // 获取输入长度和容量
    fmt.Println(len(data), cap(data))   // 获取输入长度和容量
}

打印示例代码

[]
[123 456 789]
[123 456 789]
[0 0 0]
&[]
<nil>
2 10
5 5

go语言切片扩容

go语言如何往切片中追加数据?

var demo_one = make([]string, 1, 3)

通过append往demo_one切片中添加数据

var demo_two = append(demo_one, 15)

示例代码

package main

import "fmt"

func main() {
    var demo_one = make([]string, 1, 3)   // 第一个值初始化空字符串
    var demo_two = append(demo_one, "15") // 第二个值字符串15

    var demo_three = make([]int, 1, 3)     // 第一个值初始化0
    var demo_four = append(demo_three, 15) // 第二个值整形15

    var demo_five = append(demo_two, "20")
    var demo_six = append(demo_four, 20)

    demo_two[0] = "100"
    demo_four[0] = 100

    fmt.Println(demo_one) // 输出 []
    fmt.Println(demo_two) // 输出 [ 15]

    fmt.Println(demo_three) // 输出 0
    fmt.Println(demo_four)  // 输出 [0 15]

    fmt.Println(demo_five)
    fmt.Println(demo_six)
}

示例输出

[100]
[100 15]   
[100]      
[100 15]   
[100 15 20]
[100 15 20]

通过append扩容之后,重新开辟了一个新的空间来存储新的切片,所以demo_one还是原先的demo_one,但是demo_two已经不是新的切片。

转载注明:

0 条评论

还没有人发表评论

发表评论 取消回复

记住我的信息,方便下次评论
有人回复时邮件通知我