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[:]
}
运行结果如下 说明是可以编译通过的
package main
import "fmt"
func main(){
s:=[]int{1,2};
s[0]=123;
fmt.Println("%v",s)
}
运行结果如下 说明是可以直接像数组一样修改其中的值的
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])
}
}
哇 发现已经初始化了的切片 往其中**加入超过原来容器的长度的数据会提示错误 ** 数组角标越界的问题
这个也很好理解,一开始都初始化了都定义了,都明知道长度了,还要使用未知角标当然报错
修改代码再试一下 没有一开始初始化的
package main
import "fmt"
func main(){
var s []int;
i:=0;
for i=0;i<10000;i++{
s[i]=i;
}
fmt.Println("%v",s)
}
还是报错 原来踩雷了 这个是空切片 啥也没指定。
再修改代码试试
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()往其中添加元素
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

通过 s:=make([]int,2) 直接定义一个切片,并且给 0和 1这两个元素赋值0
怎么往切片当中添加数据呢?
通过s=append(s,i) 这种方式 s表示切片,并且已初始化的切片和空切片都可以往其中添加元素