Go基础语法:数组

2023-09-22 11:00:00

6 数组

6.1 数组的定义

数组在定义时就需要声明其元素数量和类型:

// T 即元素类型
var 数组变量名 [元素数量] T

如:var a [5]int.

数组的长度必须是常量,并且长度是数组类型的一部分,一旦定义,长度不能变。所以,[5]int[10]int 是不同的类型。

package main

import "fmt"

func main() {
	var a [3]bool
	var b [6]bool

	// a的类型是-[3]bool,b 的类型是-[6]bool
	fmt.Printf("a的类型是-%T,b 的类型是-%T", a, b)
}

数组可以通过下表进行访问,下标从 0 开始,最后一个元素下标为:len-1

6.2 数组的初始化

6.2.1 方式1——通过初始化列表设置值

package main

import "fmt"

func main() {
	// 未初始化时,元素取类型默认值(零值):bool 零值为 false; 整型和浮点型的零值为 0;字符串的零值为:""
	var arr1 [3]int
	var arr2 = [3]int{1, 2, 3}
	var strArr = [3]string{"北京", "上海", "广州"}

	// [0 0 0]
	fmt.Println(arr1)
	// [1 2 3]
	fmt.Println(arr2)
	// [北京 上海 广州]
	fmt.Println(strArr)
}

6.2.2 初始化方式2——...

package main

import "fmt"

func main() {
	// ... 表示让系统根据初始值自己去数元素数量
	arr1 := [...]int{1, 2, 3, 4, 5, 6, 7, 8}
	fmt.Println(arr1)
}

6.2.3 初始化方式3——使用零值补足元素

package main

import "fmt"

func main() {
	// 初始时元素真实数量小于声明数量时,使用元素类型对应的默认值补足
	var arr1 = [5]int{1, 2, 3}
	// [1 2 3 0 0]
	fmt.Println(arr1)
}

6.2.4 初始化方式4——指定索引对应的值

package main

import "fmt"

func main() {
	// 初始时元素真实数量小于声明数量时,可以指定某个索引对应的值,未指定的部分使用默认值补足
	var arr1 = [5]int{0: 1, 4: 2}
	// [1 0 0 0 2]
	fmt.Println(arr1)
}

6.3 数组的遍历

可以使用 forfor-range 两种方式

package main

import (
	"fmt"
)

func main() {

	arr1 := [...]int{1, 2, 3, 4, 5, 6, 7}

	for i := 0; i < len(arr1); i++ {
		// 获取数组指定索引位置对应的元素并打印
		fmt.Println(arr1[i])
	}

	for index, intValue := range arr1 {
		fmt.Printf("索引 %d 对应的值为 %d \n", index, intValue)
	}
}

6.4 多维数组

6.4.1 多维数组的声明和初始化

var arr [3][2]int 表示声明一个二维数组,该二维数组有三个元素,每个元素都是一个有两个 int 元素的数组。

package main

import "fmt"

func main() {
	var arr [3][2]int
	arr = [3][2]int{
		// 二维数组中,每个一维数组后面都必须跟一个逗号,否则报错。
		[2]int{1, 2},
		// 可以省略以为数组类型的声明,直接写值
		{3, 4},
		{5, 6},
	}
	// [[1 2] [3 4] [5 6]]
	fmt.Println(arr)
}

在声明多维数组时,只有最外层可以使用 ....如:

package main

import "fmt"

func main() {
	arr := [...][2]int{
		{1, 2},
		{3, 4},
		{5, 6},
	}
	// [[1 2] [3 4] [5 6]]
	fmt.Println(arr)
}

6.4.2 多维数组的遍历

嵌套 for 循环

package main

import "fmt"

func main() {
	var arr [3][2]int
	arr = [3][2]int{
		{1, 2},
		{3, 4},
		{5, 6},
	}

	for _, v1 := range arr {
		for _, v2 := range v1 {
			fmt.Printf("%d \t", v2)
		}
		fmt.Println()
	}
}

输出结果如下:

1 	2 	
3 	4 	
5 	6 

6.4.3 数组是值类型(值传递)

数组是值类型(值传递),赋值和传参会复制整个数组。因此改变副本的值并不会改变其本身。

package main

import "fmt"

func main() {
	a := [...]int{1, 2, 3}
	modifyArr1(a)
	// [1 2 3]
	fmt.Println(a)

	b := [...][2]int{
		{1, 2}, {3, 4}, {5, 6},
	}
	modifyArr2(b)
	// [[1 2] [3 4] [5 6]]
	fmt.Println(b)
}

func modifyArr1(x [3]int) {
	x[0] = 100
}

func modifyArr2(y [3][2]int) {
	y[2][0] = 100
}
package main

import "fmt"

func main() {
	a := [...]int{1, 2, 3}
	b := a

	b[0] = 100
	// [1 2 3]
	fmt.Println(a)
	// [100 2 3]
	fmt.Println(b)
}

6.5 数组比较

  • 数组支持 ==!= 操作符,因为内存总是被初始化过的

  • [n]*T 表示元素为指针的数组;*[n]T 表示数组的指针

6.6 练习题

6.6.1 求数组中所有元素的和

[1,3,5,7,8] 中元素的和

package main

import "fmt"

func main() {
	a := [...]int{1, 3, 5, 7, 8}

	sum := 0

	for _, v := range a {
		sum += v
	}
	fmt.Println(sum)
}

6.6.2 找出数组中和为指定值的两个元素的下标

[1,3,5,7,8] 中找出和为8的两个元素的下标

package main

import "fmt"

func main() {
	a := [...]int{1, 3, 5, 7, 8}

	for outIndex, v1 := range a {
		for i := outIndex + 1; i < len(a); i++ {
			v2 := a[i]
			if v1+v2 == 8 {
				fmt.Printf("索引值为 %d,%d \n", outIndex, i)
			}
		}
	}
}
更多推荐

算法通关村-----LRU的设计与实现

LRU缓存问题描述请你设计并实现一个满足LRU(最近最少使用)缓存约束的数据结构。实现LRUCache类:LRUCache(intcapacity)以正整数作为容量capacity初始化LRU缓存。intget(intkey)如果关键字key存在于缓存中,则返回关键字的值,否则返回-1。voidput(intkey,i

YashanDB第三期YCA认证培训圆满结束

9月11日,由YashanDB举办的“第三期YCA认证培训”圆满结束。本次培训吸引了超过110名学员报名,华润数字科技有限公司、北京中亦安图科技股份有限公司、迪思杰(北京)数据管理技术有限公司等多家合作伙伴积极参与。经过7天的学习,在9月6日举行的YCA认证考试中,77名学员获得“YashanDB数据库V22.2认证管

Linux命令行操作:使用“more“命令进行分页显示

文章目录1.引言1.1介绍Linux操作系统和命令行界面什么是Linux操作系统?为什么命令行界面在Linux中如此重要?1.2介绍Linux中的分页显示命令分页显示命令的作用与意义不同分页显示命令的比较2."more"命令的基本用法2.1安装和启动"more"命令如何安装"more"命令?如何从命令行中启动"more

golang使用高阶函数优化业务功能

业务描述两个接口(新增Tag和更新Tag),在业务层均需要添加两个校验,校验Tag信息是否重复和Tag的数据中的编码是否重复。基本实现方式对应的增加两个校验的函数/方法,在接口实现中依次调用两个函数/方法进行校验。优缺点实现简单;但重复代码多,后期再增加其他校验,扩展性较差。高阶函数方式一方式因为业务方法参数相同,业务

FOXBORO FBM233 P0926GX控制脉冲模块

FOXBOROFBM233P0926GX是一种控制脉冲模块,通常用于工业自动化和控制系统中。这个模块的主要功能是生成和控制脉冲信号,以用于执行特定的操作或控制过程。以下是可能适用于FOXBOROFBM233P0926GX控制脉冲模块的一些常见特点:脉冲生成:FBM233P0926GX模块通常能够生成可控的脉冲信号,包括

界面组件DevExpress WinForms v23.1 - 富文本编辑器等功能升级

DevExpressWinForms拥有180+组件和UI库,能为WindowsForms平台创建具有影响力的业务解决方案。DevExpressWinForms能完美构建流畅、美观且易于使用的应用程序,无论是Office风格的界面,还是分析处理大批量的业务数据,它都能轻松胜任!DevExpressWinForm控件已正

Vue3_vite

目录使用Vue-cli创建使用vite创建CompositionAPI组合APIsetup执行时机setup的参数ref函数reactive函数Vue3.0中的响应式原理Vue2的响应式实现原理Vue3的响应式实现原理通过Proxy(代理):拦截对象中任意属性的变化,包括属性值的读写,属性的添加,属性的删除。通过Ref

Linux网络编程

一.协议1.1什么是协议从应用的角度出发,协议可理解为“规则”,是数据传输和数据的解释的规则。假设,A、B双方欲传输文件。规定:第一次,传输文件名,接收方接收到文件名,应答OK给传输方;第二次,发送文件的尺寸,接收方接牧到该数据再次应答一个OK;第三次.传输文件内容。同样.接收方接收数据完成后应答OK表示文件内容接收成

【HCIE】04.网络安全技术

端口隔离在同一VLAN中可以隔离二层与三层通信,让同VLAN内的设备可以通信或者不可以通信。定义一个端口隔离组,在一个组内无法互访,不在一个组里面可以进行互访port-isolateenablegroup1//使能端口隔离功能port-isolatemdoeall//全局模式实现二层隔离,三层互访intg0/0/1po

207. 课程表

207.课程表题目-中等难度示例1.bfs题目-中等难度你这个学期必须选修numCourses门课程,记为0到numCourses-1。在选修某些课程之前需要一些先修课程。先修课程按数组prerequisites给出,其中prerequisites[i]=[ai,bi],表示如果要学习课程ai则必须先学习课程bi。例如

MySQL面试题——隔离级别相关面试题

隔离级别相关面试题MySQL事务隔离级别未提交读——可以读到其他事务未提交的数据(最新的版本)错误现象:脏读、不可重复读、幻读的现象提交读(RC)——可以读到其他事务已提交的数据(最新已提交的版本)错误现象:不可重复读、幻读现象使用场景:希望看到最新的有效值可重复读(RR)——在事务范围内,多次读能够保证一致性(快照建

热文推荐