上一篇介绍了固定长度数组和动态数组的声明和函数的传递,这一篇详细介绍切面的声明方式和使用。
slice的声明方式
方法1:声明切片,并且初始化值
func main() {
// 声明方法1:声明一个切片,并且初始化,默认值是1、2、3,长度len是3
slice1 := []int{1,2,3}
fmt.Printf("len = %d, slice1 = %v\n", len(slice1),slice1) // %v为相应值的默认格式
}
运行结果;
方法2:声明切片,但没有分配内存空间
当声明的时候没有附带初始化值,这个时候动态数组为空,并且没有给该slice分配内存空间
func main() {
// 声明方法2:声明一个切片,但是没有给切片slice分配空间
var slice2 [] int
fmt.Printf("len = %d, slice2 = %v\n", len(slice2),slice2) // %v为相应值的默认格式
}
- 第三行声明了slice2,但是没有初始化值
- 第5行打印切片的相关信息
运行结果:
可以看到长度为0,是一个空的切片,注意这个时候并没有给sclice2开辟一个内存空间,所以直接赋值时会报错,如:
func main() {
// 声明方法2:声明一个切片,但是没有给切片slice分配空间
var slice2 [] int
fmt.Printf("len = %d, slice2 = %v\n", len(slice2),slice2) // %v为相应值的默认格式
slice2[0] = 1
}
- 第6行在没有分配给slice2内存地址直接强行赋值
运行结果:
发现报错,所以这个时候需要使用make
来先开辟一段内存地址用来存放赋给slice2的值。
使用make
分配内存空间
make只能为slice, map, channel分配内存,并返回一个初始化的值。首先来看下make有以下三种不同的用法:
make(map[string]string)
make([]int, 2)
make([]int, 2, 4)
make用法的详细说明:https://www.cnblogs.com/xiaxiaosheng/p/11167326.html
这里使用第二种分配方式制定数据类型和长度:
func main() {
// 声明方法2:声明一个切片,但是没有给切片slice分配空间
var slice2 [] int
slice2 = make([]int, 3) // 使用make内存空间,开辟3个空间,默认值为0
fmt.Printf("len = %d, slice2 = %v\n", len(slice2),slice2) // %v为相应值的默认格式
}
- 第5行分配给slice数据类型和长度
运行结果:
、
可以看到make分配之后打印出来的slice的初始化值都为0,这个时候再去修改slice其他值就不会报错了。
方法3:声明切片,同时使用make分配内存空间,初始化默认值为0
这个方法就是将方法2的声明和make
结合起来使用:
func main() {
// 声明方法3:声明一个切片,同时使用make分配内存空间,初始化的默认值为0
var slice3 = make([]int ,3)
fmt.Printf("len = %d, slice2 = %v\n", len(slice3),slice3) // %v为相应值的默认格式
}
- 使用var声明一个切片
slice3
,并且同时使用make分配一段地址给slice3
运行结果:
方法4:方法3的简写,使用:=推导出声明的数据类型为切片
使用 变量名 := make()
来简写方法3
func main() {
// 声明方法4:声明一个切片,同时使用make分配内存空间,初始化的默认值为0,使用:=推导出slice是一个切片
slice4 := make([]int ,3)
fmt.Printf("len = %d, slice2 = %v\n", len(slice4),slice4) // %v为相应值的默认格式
}
运行结果:
判断slice是否为0值
在 Go 中,任何类型在未初始化时都对应一个零值:布尔类型是 false ,整型是 0 ,字符串是 "" ,而指针,函数,interface,slice,channel和map的零值都是 nil
判断一个切片是否为0值的方法就是,使用if将需要判断的切片和nil
进行比较即可,例如:
var slice5 []int
if slice5 == nil {
fmt.Println("数组没有分配空间")
} else {
fmt.Println("数组有内存空间")
}
运行结果:
此处评论已关闭