上一篇介绍了固定长度数组和动态数组的声明和函数的传递,这一篇详细介绍切面的声明方式和使用。

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为相应值的默认格式
}

运行结果;
image.png

方法2:声明切片,但没有分配内存空间

当声明的时候没有附带初始化值,这个时候动态数组为空,并且没有给该slice分配内存空间

func main() {
    // 声明方法2:声明一个切片,但是没有给切片slice分配空间
    var slice2 [] int

    fmt.Printf("len = %d, slice2 = %v\n", len(slice2),slice2) // %v为相应值的默认格式
}
  • 第三行声明了slice2,但是没有初始化值
  • 第5行打印切片的相关信息

运行结果:
image.png
可以看到长度为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内存地址直接强行赋值

运行结果:
image.png
发现报错,所以这个时候需要使用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数据类型和长度

运行结果:
image.png
可以看到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

运行结果:
image.png

方法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为相应值的默认格式
}

运行结果:
image.png

判断slice是否为0值

在 Go 中,任何类型在未初始化时都对应一个零值:布尔类型是 false ,整型是 0 ,字符串是 "" ,而指针,函数,interface,slice,channel和map的零值都是 nil

判断一个切片是否为0值的方法就是,使用if将需要判断的切片和nil进行比较即可,例如:

    var slice5 []int
    if slice5 == nil {
        fmt.Println("数组没有分配空间")
    } else {
        fmt.Println("数组有内存空间")
    }

运行结果:
image.png

最后修改:2024 年 03 月 13 日
如果觉得我的文章对你有用,请随意赞赏