美文网首页
Go语言入门:数组

Go语言入门:数组

作者: 零壹视界 | 来源:发表于2020-02-15 23:12 被阅读0次

    第一种声明方式

    var firstArray [2] int
    fmt.Println(firstArray[0])
    firstArray[1] = 1
    fmt.Println(firstArray[1])
    

    这是第一种数组声明方式,未初始化的元素值默认为0,需要指明数组的长度,然后使用下标索引方式初始化和访问元素。

    简洁的方式

    我们知道Java中数组还有这种初始化方式,直接初始化具体元素,数组长度自动获得:

    int[] intArray = new int[]{1, 2, 3, 4, 5};
    

    对应在Go中是这样的:

    secondArray := [...]int{1, 2, 3, 4, 5}
    
    //数组的循环
    for index, item := range secondArray {
        fmt.Println(index, item)
    }
    for i := 0; i < len(secondArray); i++ {
        fmt.Println(i, secondArray[i])
    }
    

    有点怪异,不习惯,第一次使用还有可能会把[...]中的...省略了,如果省略了,那就不是一个数组了,而是一个slice,可以用下面的代码验证一下:

    fmt.Println(reflect.TypeOf([]int{1, 2}))
    fmt.Println(reflect.TypeOf([...]int{1, 2}))
    

    输出结果是:[]int和[2]int。看着又是很相似的结果,但[]int是slice,[2]int是数组,中括号中有数字表示是数组。

    SLICE

    说到slice,slice是什么?先看下slice怎么得到:

    sliceOfArray = secondArray[0:1]
    fmt.Println(reflect.TypeOf(sliceOfArray)
    

    上面的输出结果也是[]int,和上一段代码:fmt.Println(reflect.TypeOf([]int{1, 2}))输出是一样的。这个slice和Python里的列表slice很像(Java数组没有slice功能,只能用apache-commons中的ArrayUtils实现类似功能):

    int_list = [1, 2, 3, 4, 5]
    sub_list = int_list[0:1]
    
    #python的slice更灵活
    print(int_list[0:])
    print(int_list[:3])
    print(int_list[0:-1])
    

    从表面使用上看的话,就是取子数组或子列表的功能,但更深入看,Python中的列表slice操作返回的是一个新的子列表,而Go中slice操作返回的不是一个新的子数组,而是一个和原数组共用内存的slice,这样的设计可以减少切片操作时的内存消耗,提高性能,这里我们可以把生成的slice看做的原数组的一个子片断视图,它本身不存数据,访问到的元素,还是原数组里的元素。

    相关文章

      网友评论

          本文标题:Go语言入门:数组

          本文链接:https://www.haomeiwen.com/subject/esyufhtx.html