数组就是一篇连续的内存,几乎所有的计算机语言都有数组,只不过 Go 语言里面的数组其实并不常用,这是因为数组是定长的静态的,一旦定义好长度就无法更改,而且不同长度的数组属于不同的类型,之间不能相互转换相互赋值,用起来多有不方便之处。

切片是动态的数组,是可以扩充内容增加长度的数组。当长度不变时,它用起来就和普通数组一样。当长度不同时,它们也属于相同的类型,之间可以相互赋值。切片的便捷性让数组的绝大多数应用领域都广泛地被取代了。

不过也不可以小瞧数组,在切片的底层实现中,数组是切片的基石,是切片的特殊语法隐藏了内部的细节,让用户不能直接看到内部隐藏的数组。切片不过是数组的一个包装,给顽固的数组装上了灵活的翅膀,让石头也可以展翅飞翔。

仅仅是上面纯文字的说明,读者肯定会感觉很懵。下面让我们来看具体的实例。

数组变量的定义

我们先试一下只申明类型,不赋初值。这时编译器会给数组默认赋上「零值」。数组的零值就是所有内部元素的零值。

package mainimport "fmt"func main() {var a [9]intfmt.Println(a)}------------[0 0 0 0 0 0 0 0 0]复制代码

下面我们看看另外三种变量定义的形式, 效果都是一样的

package mainimport "fmt"func main() {var a = [9]int{1, 2, 3, 4, 5, 6, 7, 8, 9}var b [10]int = [10]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}c := [8]int{1, 2, 3, 4, 5, 6, 7, 8}fmt.Println(a)fmt.Println(b)fmt.Println(c)}---------------------[1 2 3 4 5 6 7 8 9][1 2 3 4 5 6 7 8 9 10][1 2 3 4 5 6 7 8]复制代码

数组的访问

接下来我们使用下标来简单操作一下数组,这个数组里存的是数字的平方值

package mainimport "fmt"func main() {var squares [9]intfor i := 0; i < len(squares); i++ {squares[i] = (i + 1) * (i + 1)}fmt.Println(squares)}--------------------[1 4 9 16 25 36 49 64 81]复制代码

数组的下标越界检查(高阶知识)

上面的代码中我们注意到可以使用内置函数 len() 来直接获取数组的长度。数组的长度是编译期确定的,当我们使用 len() 函数访问数组的长度属性时,编译器在背后偷偷把它替换成了整数值。

package mainimport "fmt"func main() {var a = [5]int{1,2,3,4,5}a[101] = 255fmt.Println(a)}-----./main.go:7:3: invalid array index 101 (out of bounds for 5-element array)复制代码

上面的代码运行结果说明了 Go 语言会对数组访问下标越界进行编译器检查。有一个重要的问题是,如果下标是一个变量,Go 是如何检查下标越界呢?变量需要在运行时才可以决定是否越界,Go 是如何办到的呢?

package mainimport "fmt"func main() {var a = [5]int{1,2,3,4,5}var b = 101a[b] = 255fmt.Println(a)}------------panic: runtime error: index out of rangegoroutine 1 [running]:main.main()/Users/qianwp/go/src/github.com/pyloque/practice/main.go:8 +0x3dexit status 2复制代码

答案是 Go 会在编译后的代码中插入下标越界检查的逻辑,所以数组的下标访问效率是要打折扣的,比不得 C 语言的数组访问性能。

数组赋值

同样的子元素类型并且是同样长度的数组才可以相互赋值,否则就是不同的数组类型,不能赋值。数组的赋值本质上是一种浅拷贝操作,赋值的两个数组变量的值不会共享。

package mainimport "fmt"func main() {var a = [9]int{1, 2, 3, 4, 5, 6, 7, 8, 9}var b [9]intb = aa[0] = 12345fmt.Println(a)fmt.Println(b)}--------------------------[12345 2 3 4 5 6 7 8 9][1 2 3 4 5 6 7 8 9]复制代码

从上面代码的运行结果中可以看出赋值后两个数组并没有共享内部元素。如果数组的长度很大,那么拷贝操作是有一定的开销的,使用的时候一定需要注意。下面我们尝试使用不同长度的数组赋值会有什么结果

package mainimport "fmt"func main() {var a = [9]int{1, 2, 3, 4, 5, 6, 7, 8, 9}var b [10]intb = afmt.Println(b)}--------------------------./main.go:8:4: cannot use a (type [9]int) as type [10]int in assignment复制代码

可以看出不同长度的数组之间赋值是禁止的,因为它们属于不同的类型。

数组的遍历

数组除了可以使用下标进行遍历之外,还可以使用 range 关键字来遍历,range 遍历提供了下面两种形式。

package mainimport "fmt"func main() {var a = [5]int{1,2,3,4,5}for index := range a {        fmt.Println(index, a[index])    }    for index, value := range a {fmt.Println(index, value)}}------------0 11 22 33 44 50 11 22 33 44 5复制代码

考虑到切片的内容太多,我们将独立一节专门讲解切片,下一节将是 Go 语言的极有价值的一节,读者一定要努力搞清楚每一个细节。

go int 转切片_「快学 Go 语言」第 4 课——低调的数组相关推荐

  1. 《快学 Go 语言》第 11 课 —— 千军万马跑协程

    协程和通道是 Go 语言作为并发编程语言最为重要的特色之一,初学者可以完全将协程理解为线程,但是用起来比线程更加简单,占用的资源也更少.通常在一个进程里启动上万个线程就已经不堪重负,但是 Go 语言允 ...

  2. 《快学 Go 语言》第 5 课 —— 神奇的切片

    切片无疑是 Go 语言中最重要的数据结构,也是最有趣的数据结构,它的英文词汇叫 slice.所有的 Go 语言开发者都津津乐道地谈论切片的内部机制,它也是 Go 语言技能面试中面试官最爱问的知识点之一 ...

  3. go int 转切片_一文掌握GO语言实战技能(二)

    Go 数组 Go 切片 Go 变量和内存地址 Go Map 类型 Go 面向对象编程 Go 方法的定义 GO 数组 数组是同一类型的元素集合.Go中的数组下标从0开始,因此长度为n的数组下标范围是[0 ...

  4. 《快学 Go 语言》第 7 课 —— 冰糖葫芦串

    字符串通常有两种设计,一种是「字符」串,一种是「字节」串.「字符」串中的每个字都是定长的,而「字节」串中每个字是不定长的.Go 语言里的字符串是「字节」串,英文字符占用 1 个字节,非英文字符占多个字 ...

  5. 《快学 Go 语言》第 7 课 —— 诱人的烤串

    字符串通常有两种设计,一种是「字符」串,一种是「字节」串.「字符」串中的每个字都是定长的,而「字节」串中每个字是不定长的.Go 语言里的字符串是「字节」串,英文字符占用 1 个字节,非英文字符占多个字 ...

  6. 「快学springboot」SpringBoot多环境配置文件

    [原创] Happyjava 2019-06-18 07:01:00 往期文章 「快学Docker」Docker简介.安装和Hello World实现 「快学springboot」使用springbo ...

  7. 快学 Go 语言 第 3 课 —— 分支与循环

    程序 = 数据结构 + 算法 上面这个等式每一个初学编程的同学都从老师那里听说过.它并不是什么严格的数据公式,它只是对一般程序的简单认知.数据结构是内存数据关系的静态表示,算法是数据结构从一个状态变化 ...

  8. 「动手学深度学习」在B站火到没谁,加这个免费实操平台,妥妥天花板!

    论 AI 圈活菩萨,非李沐老师莫属. 前有编写「动手学深度学习」,成就圈内入门经典,后又在B站免费讲斯坦福 AI 课,一则艰深硬核讲论文的视频播放量36万,不少课题组从导师到见习本科生都在追番. 如此 ...

  9. 「动手学深度学习」在B站火到没谁,加这个免费实操平台,妥妥天花板

    论 AI 圈活菩萨,非李沐老师莫属. 前有编写「动手学深度学习」,成就圈内入门经典,后又在B站免费讲斯坦福 AI 课,一则艰深硬核讲论文的视频播放量36万,不少课题组从导师到见习本科生都在追番. 如此 ...

最新文章

  1. 大话软件测试与职业生涯
  2. 二、Go语言基础入门
  3. Linux学习之系统编程篇: 阻塞信号集、未决信号集、自定义信号集
  4. 任务调度开源框架Quartz动态添加、修改和删除定时任务
  5. 如何成为专家-核心的七个特质
  6. qlabel可以选中吗_qlabel 详解
  7. 振兴会杜振国分析美股行情
  8. lbs与gis的计算机存储模式,什么是LBS、GIS
  9. 放弃吧少年,Leader才不会管你死活
  10. SEO专用虚拟主机横空出世
  11. 鸿蒙系统体验报告,我雷某人摊牌了,鸿蒙2.0版本使用体验汇报
  12. vue 中嵌入iframe页面
  13. 520,冰河亲自整理的Git命令汇总升级版,悄悄努力,然后惊艳所有人(升级版)
  14. 剑御九州手游辅助升级工具 提升战力材料介绍
  15. 用JS将两个数组的数据合并成一个数组对象
  16. ES聚合之Bucket聚合语法讲解
  17. 写一个将华氏温度转换成摄氏温度的程序,转换的公式是:°F = (9/5)*°C + 32 其中C表示摄氏温度F表示华氏温度程序的输入是一个整数表示华氏温度。输出对应的摄氏温度也是一个整数(java)
  18. 贝叶斯软件genle教程_贝叶斯网络可视化软件GeNIe使用说明
  19. 华为为什么培养不出人
  20. LINUX中IPTABLES和TC对端口的带宽限制

热门文章

  1. 实现两个数的交换(异或,加减)
  2. 计算机网络流量图阅读与理解,计算机网络流量监控的设计与实现
  3. 汽车电子嵌入式技术篇(二) -autosar中的嵌入式系统函数的调用
  4. AUTOSAR从入门到精通100讲(四十八)-Lin通信协议栈分析两步走-LinTrcvLIN Driver
  5. android实现箭头流程列表_Android开发关于ExpandableListView上下箭头左右显示的笔记...
  6. 备份ad_IT管理公开课——备份恢复解决方案
  7. 上海交大计算机学院奖学金,上海交通大学-电子信息与电气工程学院-学生工作办公室...
  8. html 文本框 自动拼接,HTML 中table的结构以及拼接
  9. git获取本地版本号_Git使用小结
  10. 自己写了一个多行文本溢出文字补全的小库, 说不定你会用得到的