go语言学习笔记4-复合数据类型

1. 数组

    数组长度固定,因此在go语言中很少直接使用。slice的长度可以增长和缩短,在很多场合下使用的更多。但是在理解slice之前,我们必须先理解数组。

    var a [3]int                      //包含3个整数的数组
    fmt.Println(a[0])                 //输出数组的第一个元素
    fmt.Println(a[len(0) - 1])        //输出数组的最后一个元素
    //输出索引和元素
    for i, v := range a {
        fmt.Printf("%d %d\n", i, v)
    }
    //仅仅输出元素
    for _, v := range a {
        fmt.Printf("%d\n", v)
    }

    也可以使用数组字面量根据一组值来初始化一个数组。

    var q [3]int = [3]int{1 ,2 ,3}
    var r [3]int = [3]int{1, 2}
    fmt.Println(r[2])                //"0"

    如下定义了一个拥有100个元素的数组r,除了最后一个元素值是-1,该数组中的其他元素值都是0。

    r := [...]int{99:-1}

    如果一个数组的元素类型是可比较的,那么这个数组也是可比较的。数组比较的结果是两个数组的元素的值是否完全相同。在golang中数组的size也属于数组的类型

    a := [2]int{1, 2}
    b := [...]int{1, 2}
    c := [2]int{1, 3}
    fmt.Println(a == b, a == c, b == c) //"true false false"
    d := [3]int{1, 2}
    fmt.Println(a == d)                //编译错误:无法比较[2]int == [3]int

2. slice

    slice表示一个拥有相同类型元素的可变长度的序列。slice通常写成[]T,其中元素的类型都是T;slice看上去像是没有长度的数组。
    数组和slice是紧密关联的。slice是一种轻量级的数据结构,可以用来访问数组的部分或者全部的元素,而这个数组称为slice的底层数组。slice有三个属性:指针、长度和容量。指针指向数组的第一个可以从slice中访问的元素,但是这个元素并不一定是数组的第一个元素。长度是指slice中有效元素的个数。容量是指slice中可容纳元素的个数。go的内置函数lencap用来返回slice的长度和容量。
    一个底层数组可以对应多个slice,这些slice可以引用数组的任何位置。彼此之间的元素还可以重叠。如下为slice的两种申明:

        /*
         1. 基于数组的声明
         */
        //由于月份总是从1开始,因此省略索引0的声明
        months := [...]string{1: "January", /* ... */, 12: "December"}
        summer := months[6:9]

        /*
         2. 使用内置的make函数声明
         */
         t1 := make([]T, len)
         t2 := make([]T, len, cap)     //和 make([]T, cap)[:len]功能相同
         s :=[]int{0, 1}               //此处的s是指向数组的slice
         a :=[...]int{0, 1}            //a是数组,请与s区别

    使用数组指针作为参数重写reverse函数。

猜你喜欢

转载自blog.csdn.net/u014653110/article/details/80760617