go 之数组和切片

7个月前 0 0 151

在GO中, 切片和数组是密切相关的。

数组

在Go中,数组是一个定长的序列, 其中元素类型都是相同的。数组的元素都是使用[]来索引, 索引从0开始,例如获取第一个元素arr[0], 获取最后一个arr[len(arr) - 1]

数组的创建

[length]Type
[N]Type{value1, value2, .....}
[...]Type{value1, value2, .....}

如果使用省略符操作符, GO会为我们自动计算数组的长度。

  buff := []byte{96, 33, 123}
    fmt.Println(buff[:2])
    fmt.Println(string(buff))

切片

在这里不得不说切片了, 因为在GO语言中数组几乎都是用切片替代的, 因为切片比数组强大且灵活。数组的传递成本非常大, 都是以值来传递的, 虽然可以通过&指针来替代, 但是还是推荐你来使用切片。因为切片使用的引用传递,传递成本非常小。还有就是数组是定长的, 而切片是可变的。以及GO标准库所有的公开函数中, 都是使用的切片而非数组。

创建切片

make([]Type, length, capacity)
make([]Type, length)
[]Type{}
[]Type{value1, value2, ......}

内置的make函数可以创建切片, 通道还有映射。 当我们使用make函数来创建切片的时候, 它会创建一个隐藏的初始值为零的数组, 然后返回一个引用该隐藏数组的切片。

第一种创建方法:数组长度 = 切片容量
第二种创建方法: 数组长度 = 切片长度
第三种 && 第四种 : 数组长度 = 切片中项的个数

切片的长度永远都是<=容量的。一般情况下都是推荐使用make函数来创建切片,取决于个人的习惯了。下面来看一个例子切片和隐藏的数组的关系

arr := []string{"a", "b", "c", "d", "e"}
    arr1 := arr[:1]
    arr2 := arr[:2]
    arr3 := arr[:3]
    fmt.Println(arr1, arr2, arr3)
    arr3[0] = "h"
    fmt.Println(arr1, arr2, arr3)

[a] [a b] [a b c]
[h] [h b] [h b c]

有没有发现问题? 当你改变arr3的时候, 其他两个也受到了影响, 这是为什么呢?上面也说了,由于arr1, arr2, arr3三个切片都是同时引用的隐藏的数组,所以当你改变其中一个,等于改变了隐藏数组的值, 所以自然其他的两个数组也会受到影响。

这里仅仅做了简单介绍, 更多功能需要从go设计语言这本书获取, 有兴趣的可以看看。

版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)

评论 (0)

    暂无评论~

njphper@copyright From 2014 to 2019-02-17