什么是数组

首先数组是一种数据结构,而Go语言也提供了数组类型的数据结构,数组是具有相同唯一类型的一组已编号且长度固定的数据项序列,这种类型可以是任意的原始类型例如整形、字符串或者自定义类型等。

数组元素可以通过索引(位置)来读取(或者修改),索引从0开始,第一个元素索引为 0,第二个索引为 1,以此类推。数组的下标取值范围是从0开始,到数组长度减1。数组一旦定义后,其大小不能更改。

数组的语法

数组的声明和初始化需要指明其大小和数据类型。

语法格式如下:

var variable_name [SIZE]variable_type

示例代码如下:

var score [10]float32var score = [5]float32{100.0, 2.0, 3.4, 6.0, 40.0}

注意事项:

  • 初始化数组中 {} 中的元素个数不能大于 [] 中的数字

  • 如果忽略 [] 中的数字不设置数组大小,Go 语言会根据元素的个数来设置数组的大小

示例如下:

var score = []float32{100.0, 80.0, 77.5, 89.0, 60.0}score[4] = 90.0

其它创建数据方式

其它创建数据方式如下,相关说见注释:

  var a [4] float32 // 等价于:var arr2 = [4]float32{}  fmt.Println(a) // [0 0 0 0]  var b = [5] string{"hello", "Jack", "shenzhen"}  fmt.Println(b) // [hello hello shenzhen]  var c = [5] int{'A', 'B', 'C', 'D', 'E'} // byte  fmt.Println(c) // [65 66 67 68 69]  d := [...] int{1,2,3,4,5}// 根据元素的个数,设置数组的大小  fmt.Println(d)  //[1 2 3 4 5]  e := [5] int{4: 100}  fmt.Println(e)  // [0 0 0 0 100]  f := [...] int{0: 1, 4: 1, 9: 1}  fmt.Println(f)  // [1 0 0 0 1 0 0 0 0 1]

数组访问及遍历

数组可以根据下标来访问元素,比如:score[1]等。

通过将数组作为参数传递给len函数,可以获得数组的长度。

示例代码:

package mainimport "fmt"func main() {      nums := [...]float64{66.7, 88.8, 22, 68}    // nums := [...]int{12, 78, 50} //方式二    fmt.Println("length of nums is",len(a))}

输出结果:

length of nums is 4

数组的遍历

  • 遍历方式一,根据下标来遍历

package mainimport "fmt"func main() {      a := [...]float64{67.7, 89.8, 21, 78}    for i := 0; i < len(a); i++ { // 循环遍历从0到数组长度,获取数组元素        fmt.Printf("%d th element of a is %.2f\n", i, a[i])    }}
  • 当遍历方式二,使用range遍历数组

package mainimport "fmt"func main() {      a := [...]float64{67.7, 89.8, 21, 78}    for index, value := range a { // 循环遍历从0到数组长度,获取数组元素        fmt.Printf("%d th element of a is %.2f\n", index, value)    }}

其中index表示数组下标(索引),value表示数组元素。

如果您只需要值并希望忽略索引,那么可以通过使用 “_” 标识符替换索引来实现这一点。 示例如下:

for _, v := range a {  // 忽略索引}

另外需要注意的是:

  • Go中的数组是值类型,而不是引用类型。这意味着当它们被分配给一个新变量时,将把原始数组的副本分配给新变量。如果对新变量进行了更改,则不会在原始数组中反映。

package mainimport "fmt"func main() {      a := [...]string{"USA", "China", "France"}    b := a // 这里 a 会拷贝一份给b    b[0] = "Japan"    fmt.Println("a is ", a)    fmt.Println("b is ", b) }

输出打印结果如下,可以看到 a 的结果没有被修改:

a is [USA China France]  b is [Japan China France]

数组的大小是类型的一部分。因此[5]int和[25]int是不同的类型。因此,数组不能被调整大小,而切片的存在是为了解决这个问题。

什么是切片

在Go语言中,可以说切片是对数组的抽象。数组的长度不可改变,在特定场景中这样的集合就不太适用,Go中提供了一种灵活,功能强悍的内置类型切片("动态数组"),与数组相比切片的长度是不固定的,可以追加元素,在追加时可能使切片的容量增大。

切片与数组相比,不需要设定长度,在[]中不用设定值,相对来说比较自由,从概念上面来说 slice 像一个结构体,这个结构体包含了三个元素:

  • 指针,指向数组中slice指定的开始位置

  • 长度,即切片中可访问的元素长度

  • 容量,也就是slice开始位置到数组的最后位置的长度

切片的语法

定义切片的语法,切片不需要说明长度:

var identifier []type

或者可以用 make 来定义:

var slice1 []type = make([]type, len)// 也可以简写为slice1 := make([]type, len)// 或 make([]T, length, capacity)

切片初始化及使用

切片初始化及使用示例如下:

package mainimport (      "fmt")func main() {      a := [5]int{76, 77, 78, 79, 80}    // 从数组变量 a[1] to a[3] 创建新的切片变量 b    var b []int = a[1:4] //creates a slice from a[1] to a[3]    fmt.Println(b)  // [77 78 79]}

slice没有自己的任何数据。它只是底层数组的一个表示。对slice所做的任何修改都将反映在底层数组中。

(修改切片)示例代码如下:

package mainimport (      "fmt")func main() {      darr := [...]int{57, 89, 90, 82, 100, 78, 67, 69, 59}    dslice := darr[2:5]    fmt.Println("array before",darr)    for i := range dslice {        dslice[i]++    }    fmt.Println("array after",darr) }

输出结果:

array before [57 89 90 82 100 78 67 69 59]array after [57 89 91 83 101 78 67 69 59]

len()和cap()函数

切片的长度是切片中元素的数量。切片的容量是从创建切片的索引开始的底层数组中元素的数量。

  • 切片是可索引的,并且可以由 len() 方法获取长度

  • 切片提供了计算容量的方法 cap() 可以测量切片最长可以达到多少

package mainimport "fmt"func main() {   var numbers = make([]int,3,5)   printSlice(numbers)}func printSlice(x []int){   fmt.Printf("len=%d cap=%d slice=%v\n",len(x),cap(x),x)}

输出结果:

len=3 cap=5 slice=[0 0 0]

注:一个切片在未初始化之前默认为 nil,长度为 0。

append()和copy()函数

append 向slice里面追加一个或者多个元素,然后返回一个和slice一样类型的slice。

copy 函数copy从源slice的src中复制元素到目标dst,并且返回复制的元素的个数。

append函数会改变slice所引用的数组的内容,从而影响到引用同一数组的其它slice。但当slice中没有剩余空间(即(cap-len) == 0)时,此时将动态分配新的数组空间。返回的slice数组指针将指向这个空间,而原数组的内容将保持不变;其它引用此数组的slice则不受影响。

copy 方法和append 方法使用示例代码如下:

package mainimport "fmt"func main() {   var numbers []int   printSlice(numbers)   /* 允许追加空切片 */   numbers = append(numbers, 0)   printSlice(numbers)   /* 向切片添加一个元素 */   numbers = append(numbers, 1)   printSlice(numbers)   /* 同时添加多个元素 */   numbers = append(numbers, 2,3,4)   printSlice(numbers)   /* 创建切片 numbers1 是之前切片的两倍容量*/   numbers1 := make([]int, len(numbers), (cap(numbers))*2)   /* 拷贝 numbers 的内容到 numbers1 */   copy(numbers1,numbers)   printSlice(numbers1)   }func printSlice(x []int){   fmt.Printf("len=%d cap=%d slice=%v\n",len(x),cap(x),x)}

打印结果如下:

len=0 cap=0 slice=[]len=1 cap=2 slice=[0]len=2 cap=2 slice=[0 1]len=5 cap=8 slice=[0 1 2 3 4]len=5 cap=12 slice=[0 1 2 3 4]

以上示例代码已归档到我的github,如有需要欢迎下载学习交流:https://github.com/Scoefield/gokeyboardman/tree/main/arrayslice

本次有关Golang数组和切片的介绍就到这里啦,感谢您的阅读,如有疑问或意见请及时反馈给我们。


上一篇文章:

Golang中的流程语句

切片 里面包含interface_Golang的数组和切片相关推荐

  1. python数组的切片操作_对Python 数组的切片操作

    {"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],&q ...

  2. c++ map是有序还是无序的_go 学习笔记之数组还是切片都没什么不一样

    上篇文章中详细介绍了 Go 的基础语言,指出了 Go 和其他主流的编程语言的差异性,比较侧重于语法细节,相信只要稍加记忆就能轻松从已有的编程语言切换到 Go 语言的编程习惯中,尽管这种切换可能并不是特 ...

  3. python运算学习之Numpy ------ 数组的切片索引与循环遍历、条件和布尔数组、形状变化...

    数组的切片索引: 数组的切片索引和列表非常类似,下面用代码简单说明 1 a = np.random.rand(16).reshape(4, 4) 2 print("数组a:\n", ...

  4. Golang基础(变量[普通变量、数组、切片、map、list、ring]声明及赋值)

    Go语言和其他语言一样都有基本存储容器.可以存储一个或多个值在程序中,方便程序中多次使用容器中内容,这个容器称为:变量 Go语言虽然是静态类型语言,但是支持动态类型语言语法,因为Go语言希望程序员少声 ...

  5. Go 学习笔记(11)— 切片定义、切片初始化、数组和切片差异、字符串和切片转换、len()、cap()、空 nil 切片、append()、copy() 函数、删除切片元素

    1. 切片定义 Go 语言切片是对数组的抽象. Go 中提供了一种灵活,功能强悍的内置类型切片("动态数组"),与数组相比切片的长度是不固定的,可以追加元素,在追加时可能使切片的容 ...

  6. Go 分布式学习利器(5)-- 数组和切片

    文章目录 1. 数组的声明 2. 数组元素的遍历 3. 数组的截取 4. Go 语言的切片 5. 数组 和 切片的共同点 1. 数组的声明 声明并初始化为默认的零值 var a [3]int 声明同时 ...

  7. numpy数组切片:一维/二维/数组

    文章目录 numpy数组切片操作 一维数组(冒号:) 1.一个参数:a[i] 2.两个参数:b=a[i:j] 3.三个参数:格式b = a[i:j:s] 4.例子 二维数组(逗号,) 取元素 X[n0 ...

  8. byte数组截取_Go解密:数组、切片

    最近在翻阅Go部分源代码,略有涉及到数组(array)和切片(slice)的实现,本文出自Arrays, slices (and strings): The mechanics of 'append' ...

  9. golang 数组和切片

    1.数组 golang中的数组是一种由固定长度和固定对象类型所组成的数据类型.例如下面: var a [4]int a是一个拥有4个int类型元素的数组.当a一旦被声明之后,元素个数就被固定了下来,在 ...

最新文章

  1. 史上最全的正则表达式
  2. 在windows 10下安装python
  3. 一天搞定CSS: 清除浮动(float)--13
  4. 当React Native 遇到了Google reCAPTCHA
  5. tensorflow中tf.random_normal和tf.truncated_normal的区别
  6. talent-validate-all.js验证框架
  7. Linux NTP时间服务器
  8. 教你如何使用FusionInsight SqoopShell
  9. Nginx + uWSGI + flask + socketio 部署解决方案
  10. PHP XAMPP windows环境安装扩展redis 致命错误: Class ‘Redis‘ not found解决方法
  11. 数据结构课程设计:运动会分数统计
  12. uniapp 使用本地数据库
  13. 大咖带你免费学前端,附不容错过的前端100篇文章合集
  14. itext生成pdf间距_[itext]Java生成PDF文件
  15. 上线啦,PP.io!
  16. python numpy库 一些统计量计算
  17. UVM response_handler和get_response机制
  18. ITSS服务项目经理 IT服务工程师 培训 证书延续
  19. pdo_dblib.dll for php7,php_pdo_dblib.dll,下载,简介,描述,修复,等相关问题一站搞定_DLL之家...
  20. 从大三开始奋发的程序员面临新的困惑

热门文章

  1. 系统板I/O端口地址分配(一)
  2. 动态ip解析 linux,ddwrt路由/linux动态解析ip(ddns)到dnspod配置
  3. Python Linked List
  4. [BZOJ1572] [Usaco2009 Open]工作安排Job(贪心 + 堆)
  5. spring思想分析
  6. 各浏览器的Hack写法【转】
  7. [转载] python面面观单元测试_python 使用unittest进行单元测试
  8. [转载] PYTHON 字符串转换为二进制字符串,二进制字符串转换为字符串
  9. MyDAL - is null is not null 条件 使用
  10. 关于vue的npm run dev和npm run build