Go 语言学习之数组
概念
数组是具有固定长度,并且有零个或多个相同数据类型元素的序列,数组长度是数组类型的一部分,也就是说 [3]int 和 [4]int 是两个不同类型的数组,二者不可以比较,数组通过索引访问元素,Go 语言内置函数 len 可以返回数组的长度,在 Go 语言中,数组是值传递。
02
声明数组和初始化
在 Go 语言中,声明数组需要显式指定数组名称、数组长度和数组类型,默认情况下,未显示初始化一个新声明数组中的元素,数组初始值为元素类型的零值。在声明数组时,可以显式初始化数组的元素,并且可以指定索引位置和定义索引位置别名。其中,指定索引位置初始化数组元素,数组的长度为最大的索引位置数值加 1。通过代码,我们演示声明一个新数组的几种方式。
- 声明数组,未初始化 func main() { var arr [3]int fmt.Println("arr 数组的第一个元素是:", arr[0]) fmt.Println("arr:", arr) }
- 初始化数组元素 var arr2 = [4]int{1, 2, 3, 4} fmt.Println("arr2:", arr2)
- 初始化数组元素,数组长度使用省略号 var arr3 = [...]int{1, 2, 3, 4, 5} fmt.Println("arr3 的长度:", len(arr3)) 初始化数组元素,数组长度使用省略号,数组的长度由初始化数组的元素个数决定。
- 定义索引位置别名初始化数组元素 const ( name int = iota email ) var arr4 = [...]string{name: "lucy", email: "lucy@gmail.com"} fmt.Println(name, arr4[name]) fmt.Println("arr4:", arr4[0])
- 指定索引位置初始化数组元素 var arr5 = [...]int{99: 100} fmt.Println(arr5[0], arr5[1], arr5[99]) 初始化数组元素,指定索引位置,数组的长度为最大索引数值加 1。
- 声明多维数组 var arrS = [2][3]int{{1, 2, 3}, {10, 20, 30}} fmt.Println("二维数组 arrS:", arrS) var arrS2 = [...][2][3]int{ { {1, 2, 3}, {4, 5, 6}, }, { {11, 12, 13}, {14, 15, 16}, }, } fmt.Println("arrS2:", arrS2
声明多维数组,仅第一维度允许使用省略号。
03
数组比较
在 Go 语言中,数组支持比较,需要注意的是,数组的长度是数组类型的一部分,也就是说 [3]int 和 [4]int 是两个不同的数据类型,不可以比较。在数组类型一致的前提下,数组之间才可以比较,并且只有数组的所有元素值全部相等,数组才相等。通过代码,我们演示数组比较的用法。
var arr6 = [5]int{1, 2, 3, 4, 5}
var arr7 = [...]int{1, 2, 3, 4, 5}
var arr8 = [5]int{2, 3, 4, 5, 6}
if arr6 == arr7 {
fmt.Println("arr6 与 arr7 相等")
} else if arr6 == arr8 {
fmt.Println("arr6 与 arr8 相等")
}
04
数组遍历
在 Go 语言中,除了使用 for 语句通过循环访问数组的索引,遍历数组元素之外,还可以使用 for...range 遍历数组,并且可以使用 “_” 忽略数组的索引。通过代码,我们演示使用 for...range 遍历数组。
var arr6 = [5]int{1, 2, 3, 4, 5}
for index, value := range arr6 {
fmt.Printf("arr6[%d]=%dn", index, value)
}
for _, value := range arr6 {
fmt.Println("arr6=", value)
}
05
指针数组和数组指针
在 Go 语言中,指针数组是指数组的元素为指针类型的值,数组指针是指数组的内存地址。数组指针可以直接用来操作元素。通过代码,我们演示指针数组和数组指针的用法。
x, y := 1, 2
a := [2]*int{&x, &y}
p := &a
fmt.Println("数组的元素为指针类型的指针数组:", a)
fmt.Println("存储数组的内存地址的数组指针:", p)
06
数组是值传递
在 Go 语言中,数组是值传递,赋值和传参都会创建一个数组的副本,声明一个新数组,使用原数组赋值给新数组,修改原数组,新数组的元素值不改变,通过代码,我们演示数组是值传递。
var arr9 = [3]int{1, 2, 3}
var arr10 [3]int
arr10 = arr9
fmt.Println("arr9:", arr9)
fmt.Println("arr10:", arr10)
arr9[0] = 10
fmt.Println("arr9:", arr9)
fmt.Println("arr10:", arr10)
完整代码:
输出结果:
arr 数组的第一个元素是:0
arr: [0 0 0]
arr2: [1 2 3 4]
arr3 的长度:5
0 lucy
arr4: lucy
0 0 100
二维数组 arrS: [[1 2 3] [10 20 30]]
arrS2: [[[1 2 3] [4 5 6]] [[11 12 13] [14 15 16]]]
arr6 与 arr7 相等
arr6[0]=1
arr6[1]=2
arr6[2]=3
arr6[3]=4
arr6[4]=5
arr6= 1
arr6= 2
arr6= 3
arr6= 4
arr6= 5
数组的元素为指针类型的指针数组:[0xc0000b4080 0xc0000b4088]
存储数组的内存地址的数组指针:&[0xc0000b4080 0xc0000b4088]
arr9: [1 2 3]
arr10: [1 2 3]
arr9: [10 2 3]
arr10: [1 2 3]
- 桌面白屏(Active故障)修复批处理
- ASM 翻译系列第十三弹:ASM 高级知识 - Forcing the issue
- ASM 翻译系列第十四弹:ASM Internal Rebalancing act
- DIY网站统计:WordPress排除管理员评论及精准友链数的方法
- Linux运维工程师:30道面试题整理
- ASM 翻译系列第十五弹:ASM Internal ASM File Directory
- ASM 翻译系列第十六弹:ASM Internal ASM Active Change Directory
- ASM 翻译系列第十七弹:ASM Internal ASM Disk Directory
- Windows 7下获取System权限
- ASM 翻译系列第十八弹:ASM Internal ASM file number 5
- 菜单式Shell运维脚本调试小记
- 优化Postgres-x2 GTM
- 启用某些Linux发行版的root帐号
- Linux中的完美截图工具:Deepin-ScreenShot
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 树莓派综合项目2:智能小车(二)tkinter图形界面控制
- 虚拟机系列 | JVM运行时数据区
- 虚拟机系列 | 执行引擎和垃圾回收
- 在Linux系统中编译ARM版EasyNTS上云网关服务报undefined错误的解决方案
- 从全备中恢复单库或单表,小心有坑!
- Zookeeper安装以及常用操作
- Codeforces Round 671 (Div. 2) A-D
- 程序中并没有走缓存,为什么执行时间短了
- ES 常用Linux查询命令汇总
- PostgreSql 怎么获取数据库中关键系统信息(一)
- 树莓派基础实验36:通用串口通信实验
- PIMPL:休想窥探我的隐私!
- 树莓派基础实验37:pyserial模块通信实验
- 【答疑解惑】为什么你的 Charles 会抓包失败?
- Mybatis-generator 逆向工程 自定义PO,xml,mapper,example