GO语言中创建切片的三种实现方式
更新时间:2023年09月20日 09:12:26 作者:奔跑吧,高同学
这篇文章主要介绍了GO语言中创建切片的三种实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
GO中三种方式创建切片
第一种方式
var 切片名 []数据类型
var s1[]string fmt.Println(s1) fmt.Println(len(s1))
第二种方式
切片名 := []类型{}
s2 := []int{} fmt.Println(s2) fmt.Println(len(s2))
第三种方式
使用make()函数创建:make(切片类型,长度,容量)
s3 := make([]int, 3, 5) fmt.Println(s3) fmt.Println(len(s3)) fmt.Println(cap(s3))
使用make()函数创建注意事项:
1.make(切片类型,长度,容量)
2.长度是已经初始化的空间。容量是已经开辟的空间,包括已经初始化的空间和空闲的空间
3.切片长度要小于容量
4.len()返回长度,cap()返回容量
5.函数中的容量参数是可以省略的,这是容量与长度相等
s4 := make([]int, 6) fmt.Println(s4) fmt.Println(len(s4)) fmt.Println(cap(s4))
go语言—切片的定义
- 因为数组长度是固定的所以有很多局限性
- 切片是一个拥有相同元素的可变长序列,是基于数组类型做的一层封装
- 切片非常灵活,支持自动扩容
- 切片是引用类型,内部结构包含地址、长度、容量。所以不需要使用额外的内存
1、切片的定义
var a []string // 定义一个空切片,[]中不带任何内容就是切片 var b = []int{} //声明一个整数切片并初始化 var c = []bool{"false","true"} //声明一个布尔切片并初始化 // 切片是引用类型,不支持直接比较,只能和nil比较 fmt.Println(a == nil) //true fmt.Println(b == nil) //false fmt.Println(c == nil) //false
2、切片表达式
切片底层就是一个数组,所以可以基于数组通过索引得到切片
a := [5]int{1,2,3,4,5} b := a[1:3] // b := a[:] 等同于a数组所有值 fmt.Printf("类型:%T\n值:%s",b,b) 输出: 类型:[]int //int类型切片 值:[2 3]
3、切片的取值和改值
- 切片也通过索引取值和改值
- 切片修改值时,底层数组的值也会改变,与切片保持一致
- 同理,底层数组变化也会影响到切片变化
a := [6]int{1,2,3,4,5,6} b := a[:] //b为数组a的切片 b[2] = 30 //修改切片b索引为3的值 fmt.Printf("a的类型:%T\na的值:%v",a,a) fmt.Printf("b的类型:%T\nb的值:%v",b,b) 输出: a的类型:[6]int a的值:[1 2 30 4 5 6] //修改切片b,a中值同样被修改 b的类型:[]int b的值:[1 2 30 4 5 6]
4、切片的长度和容量
切片有自己的长度和容量,可以通过len()函数求长度,cap()函数求切片容量
a := [5]int{1,2,3,4,5} // 切片长度:指切片当前有多长,即存了多少值 var s []int = a[0:2] fmt.Println(s) // [1,2,3] fmt.Println(len(s)) // 3 // 切片容量:指这个切片最多能存多少值,基于底层数组来的 // 但是切片容量并不一定等于数组长度,容量大小取决于切片是从哪个地方开始切数组的,从切数组位置开始往后计算 var s1 []int = a[0:3] //从索引为0的位置向后切 fmt.Println(cap(s1)) // 容量为5 var s2 []int = a[2:] //从索引为2的位置向后切 fmt.Println(cap(s2)) //容量为3
5、使用make()函数创建切片
make()函数可以不基于数组而动态的创建切片
make([]T, size, cap)
- T:切片的元素类型
- size:切片中元素的数量
- cap:切片的容量,cap可以省略,省略时默认等于size
a := make([]int,3,10) // 创建一个长度为3,容量为10的整数型切片,默认0值 fmt.Println(a) // [0,0,0] fmt.Println(len(a)) // 3 a的内部存储空间分配了10个,但实际只用了3个 fmt.Println(cap(a)) // 10
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
最新评论