Go 学习笔记(10)— 数组定义、数组声明、数组初始化、访问数组、数组相等、向函数传递数组
1. 数组定义
数组是具有相同唯一类型的一组已编号且长度固定的数据项序列,这种类型可以是任意的原始类型例如整形、字符串或者自定义类型。
2. 声明数组
Go
语言数组声明需要指定元素类型及元素个数,语法格式如下:
var varName [SIZE]varType
语法说明如下所示:
- varName(数组变量名):数组声明及使用时的变量名。
- SIZE(元素数量):数组的元素数量,可以是一个表达式,但最终通过编译期计算的结果必须是整型数值,元素数量不能含有到运行时才能确认大小的数值。
- Type(数组类型):可以是任意基本类型,包括数组本身,类型为数组本身时,可以实现多维数组。
例如以下定义了数组 a 长度为 10, 类型为 float32:
var a [10]float32
3. 初始化数组
- 指定长度和初始化值,初始化数组中 {} 中的元素个数不能大于 [] 中的数字:
var a = [5]float32{1000.0, 2.0, 3.4, 7.0, 50.0}
默认情况下,数组的每个元素都会被初始化为元素类型对应的零值,对于数字类型来说就是 0,同时也可以使用数组字面值语法,用一组值来初始化数组:
var q [3]int = [3]int{1, 2, 3}
var r [3]int = [3]int{1, 2}
fmt.Println(r[2]) // "0"
- 不指定数组长度,
Go
语言会根据元素的个数来设置数组的大小:
var a = []float32{1000.0, 2.0, 3.4, 7.0, 50.0}
- 指定长度,通过索引值进行初始化,没有初始化的元素使用类型默认值:
a := [3]int{1:1, 3:3}
- 不指定长度,通过索引值进行初始化,数组长度由最后一个索引值确定,没有指定索引的元素被初始化为类型默认值:
a := []int{1:1, 2:3}
4. 访问数组
数组的每个元素都可以通过索引下标来访问,索引下标的范围是从 0 开始到数组长度减 1 的位置,内置函数 len()
可以返回数组中元素的个数。
var a [3]int // 定义三个整数的数组
fmt.Println(a[0]) // 打印第一个元素
fmt.Println(a[len(a)-1]) // 打印最后一个元素
var salary float32 = balance[9]
5. 数组相等
数组的长度是数组类型的一个组成部分,因此 [3]int
和 [4]int
是两种不同的数组类型,数组的长度必须是常量表达式,因为数组的长度需要在编译阶段确定。
q := [3]int{1, 2, 3}
q = [4]int{1, 2, 3, 4} // 编译错误:无法将 [4]int 赋给 [3]int
如果两个数组类型相同(包括数组的长度,数组中元素的类型)的情况下,我们可以直接通过较运算符(==
和!=
)来判断两个数组是否相等,只有当两个数组的所有元素都是相等的时候数组才是相等的,不能比较两个类型不同的数组,否则程序将无法完成编译。
a := [2]int{1, 2}
b := [...]int{1, 2}
c := [2]int{1, 3}
fmt.Println(a == b, a == c, b == c) // "true false false"
d := [3]int{1, 2}
fmt.Println(a == d) // 编译错误:无法比较 [2]int == [3]int
6. 使用示例
package mainimport "fmt"func main() {// var n [5]int,声明一个含有 5 个元素的数组,但元素默认都是 0, 一般很少这样使用var n = []int{10, 20, 30, 40, 50}average_value := get_average(n)fmt.Printf("average_value is %v\n", average_value)for j := 0; j < len(a); j++ { // len(a) 获取数组长度fmt.Printf("origin array n[%v] is %v\n", j, n[j])}fmt.Printf("###############\n")for i := 0; i < 5; i++ {n[i] = i}for index, value := range n { // 遍历数组fmt.Printf("new array n[%v] is %v\n", index, value)}}func get_average(array []int) int {array_length := len(array)var sum int = 0for i := 0; i < array_length; i++ {sum += array[i]}average := sum / array_lengthreturn average
}
7. 多维数组
Go 语言支持多维数组,以下为常用的多维数组声明方式:
var variable_name [SIZE1][SIZE2]...[SIZEN] variable_type
示例
var threedim [5][10][4]int
二维数组是最简单的多维数组,二维数组本质上是由一维数组组成的。二维数组定义方式如下:
var arrayName [x][y]variableType
arrayName 为数组名,variableType为 Go 语言的数据类型。二维数组中的元素可通过 a[i][j] 来访问。
7.1 初始化二维数组
// 使用数组字面量来声明并初始化一个二维整型数组
array = [4][2]int{{10, 11}, {20, 21}, {30, 31}, {40, 41}}
// 声明并初始化数组中索引为 1 和 3 的元素
array = [4][2]int{1: {20, 21}, 3: {40, 41}}
// 声明并初始化数组中指定的元素
array = [4][2]int{1: {0: 20}, 3: {1: 41}}
下图展示了上面示例中声明的二维数组在每次声明并初始化后包含的值。
7.2 访问二维数组
二维数组通过指定坐标来访问。如数组中的行索引与列索引,例如:
val := a[2][3]
/* 或 */
var value int = a[2][3]// 声明两个二维整型数组
var array1 [2][2]int
// 将 array1 的索引为 1 的维度复制到一个同类型的新数组里
var array3 [2]int = array1[1]
使用示例
package mainimport "fmt"func main() {/* 数组 - 5 行 2 列*/var a = [5][2]int{ {0,0}, {1,2}, {2,4}, {3,6},{4,8}}var i, j int/* 输出数组元素 */for i = 0; i < 5; i++ {for j = 0; j < 2; j++ {fmt.Printf("a[%d][%d] = %d\n", i,j, a[i][j] )}}
}
8. 向函数传递数组
向函数传递数组参数,需要在函数定义时,声明形参为数组,有以下两种形式:
(1) 形参设定数组大小
void func(param [10]int){...}
(2) 形参未设定数组大小
void func(param []int){...}
使用示例,函数接收整型数组参数,另一个参数指定了数组元素的个数,并返回平均值。
package mainimport "fmt"func main() {/* 数组长度为 5 */var balance = []int {1000, 2, 3, 17, 50}var avg float32/* 数组作为参数传递给函数 */avg = getAverage(balance, 5) ;/* 输出返回的平均值 */fmt.Printf( "平均值为: %f ", avg );
}func getAverage(arr []int, size int) float32 {var i, sum intvar avg float32 for i = 0; i < size;i++ {sum += arr[i]}avg = float32(sum) / float32(size)return avg
}
Go 学习笔记(10)— 数组定义、数组声明、数组初始化、访问数组、数组相等、向函数传递数组相关推荐
- C++ 学习笔记(3)命名空间using、字符串、string、vector、迭代器、数组
C++ 学习笔记(3)命名空间using.字符串.string.vector.迭代器.数组 参考书籍:<C++ Primer 5th> 3.1 命名空间的using声明 头文件不应该包含u ...
- thinkphp学习笔记10—看不懂的路由规则
原文:thinkphp学习笔记10-看不懂的路由规则 路由这部分貌似在实际工作中没有怎么设计过,只是在用默认的设置,在手册里面看到部分,艰涩难懂. 1.路由定义 要使用路由功能需要支持PATH_INF ...
- JavaWeb黑马旅游网-学习笔记10【项目代码】
Java后端 学习路线 笔记汇总表[黑马程序员] JavaWeb黑马旅游网-学习笔记01[准备工作] JavaWeb黑马旅游网-学习笔记02[注册功能] JavaWeb黑马旅游网-学习笔记03[登陆和 ...
- 史上最牛最强的linux学习笔记 10.shell基础
史上最牛最强的linux学习笔记 10.shell基础 写在最前面: 本文是基于某站的视频学习所得,第一个链接如下: https://www.bilibili.com/video/BV1mW411i7 ...
- springmvc学习笔记(10)-springmvc注解开发之商品改动功能
springmvc学习笔记(10)-springmvc注解开发之商品改动功能 springmvc学习笔记(10)-springmvc注解开发之商品改动功能 标签: springmvc springmv ...
- Hadoop学习笔记—10.Shuffle过程那点事儿
Hadoop学习笔记-10.Shuffle过程那点事儿 一.回顾Reduce阶段三大步骤 在第四篇博文<初识MapReduce>中,我们认识了MapReduce的八大步骤,其中在Reduc ...
- mysql分页概念_MySQL学习笔记之数据定义表约束,分页方法总结
本文实例讲述了MySQL学习笔记之数据定义表约束,分页方法.分享给大家供大家参考,具体如下: 1. primary key 主键 特点:主键是用于唯一标识一条记录的约束,一张表最多只能有一个主键,不能 ...
- Linux学习笔记10
Linux学习笔记10 Linux学习笔记10 正则表达式 源码包约定目录 Shell脚本约定目录 Shell脚本的创建与执行 date命令 同步时间 Shell脚本预设变量 与用户交互 数学计算 S ...
- PWM控制LED亮度(2-呼吸灯)-STM32电控学习笔记10
PWM控制LED亮度(2-呼吸灯)-STM32电控学习笔记10 day10:2022/9/29 前面学了两三天的PWM了,PWM本身不难理解,至于为啥进度缓慢,还不是这时钟定时器分频值重装载啥的太难理 ...
最新文章
- flask socket连接mysql_Flask连接mysql,实现页面登录
- 【竞赛题解】Codeforces Round #715 (Div. 2) C
- Spring Boot2
- docker build命令详解_Docker镜像与容器常用命令图文详解
- python - 日期处理模块
- OpenInventor笔记:线性坐标轴PoLinearAxis的使用
- Java中继承方法的使用,以及使用方法的注意事项,继承方法重写的理解,白话文详解,简单易理解
- 刘帅嵌入式系统-ORR逻辑或操作指令
- Stacking:集成学习策略图解
- iis aspnet_iisreg.exe 0x8007000B
- 加州大学圣克鲁兹分校计算机科学,加州大学圣克鲁兹分校专业设置详细介绍!...
- P3951 小凯的疑惑
- SDK全局热更新方案(全网唯一)
- 学生DW静态网页设计我的家乡——四川文化(4页) HTML+CSS+JavaScript 家乡主题HTM5网页设计作业成品
- matlab频谱分析详解
- 【YOLOv5】手把手教你使用LabVIEW ONNX Runtime部署 TensorRT加速,实现YOLOv5实时物体识别(含源码)
- 利用ffmpeg 从RTSP流 取rgb图
- 无限循环小数展示算法题
- matlab如何花间,酌酒花间,磨针石上;倚剑天下,挂弓扶桑。赞颂的是谁
- 图解jdk1.8中的intern()方法,包教包会