go 语言切片(slice)-动态数组

go 语言切片(slice)-动态数组

go语言的数组的长度是不可变的,但是很多情况下其实是不知道数组长度的,那么怎么解决这个问题呢?

类型切片应运而生,go语言提供了一个功能强悍的内置类型切片(动态数组)应运而生 ,与数组相比切片的长度是不固定的,可以追加元素,而且会自动扩容。

定义一个切片

var identifier []type

可以看到与数组几乎一样,不同点是数组得声明长度,切片不需要声明

也可以通过 make() 函数来创建切片

var identifier []type=make([]int,2)

make函数详解

/**
 * length 切片的初始长度
 * capacity 容量(不确定是否是容量到了这个就开始扩容)
 */
make([]type,length,capacity)

切片初始化

package main
import "fmt"
func main(){
    //这个几乎和数组一样 这个几乎和数组一样  length=3 capacity=3 
    s:=[]int{1,2,3};
    //声明一个数组
    b:=[]int{1,2,4}
    //将数组赋给一个切片
    c:=b[:]
}

运行结果如下 说明是可以编译通过的

image-20221101183818634

直接初始化切片 能修改其中的值吗?通过s[0]=123; 这种方式

package main
import "fmt"
func main(){
    s:=[]int{1,2};
    s[0]=123;
    fmt.Println("%v",s)
}

运行结果如下 说明是可以直接像数组一样修改其中的值的

image-20221101185725996

动态的往切片当中添加数据看会发生什么

package main
import "fmt"
func main(){
    s:=[]int{1,2};
    i:=0;
    for i=0;i<10000;i++{
        s[i]=i;
    }
    for i=0;i<10000;i++{
        fmt.Println("i %v,v %v",i,s[i])
    }
}

哇 发现已经初始化了的切片 往其中**加入超过原来容器的长度的数据会提示错误 ** 数组角标越界的问题

这个也很好理解,一开始都初始化了都定义了,都明知道长度了,还要使用未知角标当然报错

go 语言切片(slice)-动态数组_第1张图片

修改代码再试一下 没有一开始初始化的

package main
import "fmt"
func main(){
    var s []int;
    i:=0;
    for i=0;i<10000;i++{
        s[i]=i;
    }
    fmt.Println("%v",s)
}

还是报错 原来踩雷了 这个是空切片 啥也没指定。

go 语言切片(slice)-动态数组_第2张图片

再修改代码试试

package main
import "fmt"
func main(){
    var s []int=make([]int,2)
    i:=0;
    for i=0;i<10000;i++{
        s[i]=i;
    }
    fmt.Println("%v",s)
}

卧槽还是不行什么鬼?后续通过查看文档 原来有专用的方法 append()往其中添加元素

go 语言切片(slice)-动态数组_第3张图片
再在修改代码

package main
import "fmt"
func main(){
    s:=make([]int,2);
    //看看空切片能往里面加吗?
    var a []int;
    i:=0;
    for i=0;i<10000;i++{
        append(s,i);
    }
    for i=0;i<10000;i++{
        append(a,i);
    }
    fmt.Println("%v",s);
    fmt.Println("%v",a);
}

发现还是报错很奇怪
在这里插入图片描述
再次修改代码 原来需要将 append之后的值赋给切片
类似 这种 s=append(s,i)

package main
import "fmt"
func main(){
    s:=make([]int,2);
    var a []int;
    i:=0;
    for i=0;i<10;i++{
        s=append(s,i);
        a=append(a,i);
    }
    fmt.Println("s=%v a=%v",s,a)
}

成功运行 达成目标而且可以看出 s:=make([]int,2);这个就是一开始初始化 0和1角标都是初始化值0
在这里插入图片描述

总结

  1. 通过 var name []type 去声明一个空切片 ,空切片也是可以往其中添加值

​ 通过 s:=make([]int,2) 直接定义一个切片,并且给 0和 1这两个元素赋值0

  1. 怎么往切片当中添加数据呢?

    通过s=append(s,i) 这种方式 s表示切片,并且已初始化的切片空切片都可以往其中添加元素

你可能感兴趣的:(#,go基础,go,golang)