Go语言之数组/Slice篇

2023-10-30 15:23:03 浏览数 (2)

一、数组的语法介绍

Go中的数组与C 中的数组含义并无不同,表示的都是具有相同唯一数据类型的一组已经编号并且长度固定的数组项序列。

```

var varName [SIZE]type // 备注:该格式是声明格式,变量名 数组大小 数据类型

```

数组初始化:

数组的初始化基本上是以下例子中的几种格式

代码语言:javascript复制
package main
import (
"fmt"
)
func main() {
        var name0s [2]string = [2]string{"hello","shanghai"}
        var names = [...]string{"hello", "world"}
        var name1s = [5]string{"hello", "the", "world"}
        name2s := []string{"hello","go","language"}
        fmt.Println(name0s, names, name1s, name2s)
        return
}


output:


[hello shanghai] [hello world] [hello the world ] [hello go language]

二、Slice的语法介绍

Go语言里面提到数组,就避不开slice,在介绍slice之前,我们需要先看下slice与数组之间的关系。

1.slice是数组的抽象。

2.数组的长度是固定的,但是slice的长度是可变的。

Go语言中的slice与C 中的vector是很类似的。

Go中的slice初始化有下面几种方式:

代码语言:javascript复制
var silceName []type
var sliceName []type = make([]type, len)
silceName := make([]type, len)
sliceName := make([]type, len, capactity) // len表示的是slice的长度,capacity表示的是slice的容量大小,也就是说,当len<capacity的时候,slice不会重新申请内存空间,len>capacity   的时候,会重新申请一个内存空间。
slice := []int{1,2,3} // 直接将slice初始化,其中slice[0]=1,slice[0]=2,slice[0]=3,len = capacity = 3

例子如下:

Output:

在使用slice的时候,如果采用下标的方式,一旦超过了capacity的话,会提示 越界错误。

append的使用会导致,slice的append扩充,扩充规则为:

1.如果新的大小是当前大小的2倍以上,则大小增长为新大小

2.否则循环一下操作:如果当前大小小于1024,按每次2倍增长,否则每次按当前大小的 1/4 增长。直达增长的大小超过或等于新大小。

例子为:

备注:在使用slice的时候,往往会因为slice的capacity的大小不确定,而采用“下标”的方式添加,此种方式存在数组越界的风险,但是采用append可以自动扩展capacity的大小,所以笔者建议给slice新增元素的时候,尽量采用append的方式。

三、C 的vector的介绍

1.是封装动态数组的顺序容器。

2.vector 的存储是自动管理的,按需扩张收缩。vector 通常占用多于静态数组的空间,因为要分配更多内存以管理将来的增长。vector 所用的方式不在每次插入元素时,而只在额外内存耗尽时重分配。分配的内存总量可用 capacity() 函数查询。

3.标准库提供 std::vector 对类型 bool 的特化,它可能为空间效率优化。vector<bool>节省空间的动态 bitset

常用函数如下所示:

参数:https://zh.cppreference.com/w/cpp/container/vector

参考:https://zh.cppreference.com/w/cpp/container/vector

灰子作于二零一九年八月十一日。

0 人点赞