Go_数组遍历、最大值、求和、多维数组

2023-10-26

数组:

  • 数组就是用来存储数据的容器,存储多个数据时数据类型要一致。如果想要保存任意类型数据,需要声明为接口类型数组
  • 数组定义完成后,可以对数组进行赋值操作。数组是通过下标来进行操作的,下标的范围是从0开始到数组长度减1的位置

特点:

  1. 数组是一种引用数据类型
  2. 数组当中的多个数据,类型必须统一
  3. 数组的长度在程序运行期间不可改变

索引:

数组创建完成后,会在数组内开辟多个连续的空间,空间具体有多少是根据数组定义的长度决定的,而索引就是每个小空间的编号,编号是从0开始依次叠加,是用来获取数组中的数据的。数组在创建完毕后,即使没有赋值,也可以取出,但取出的元素都是默认初始化值,初始值根据数据类型而定。

数组静态初始化:

初始化:创建完后马上赋值的行为叫初始化
静态初始化:在创建数组时,直接将元素确定
动态初始化:go中只有静态,但是可以使用切片完成动态数组的操作

定义格式:

var 数组名 [元素数量] 数据类型 
var arr [5] int

静态初始化格式:

var 数组名 [元素数量] 数据类型  = [元素数量] 数据类型 {数据1,数据2,数据3...}
var arr [5] int = [5] int {0,1,2,3,4,5}
var arr = [5] int {0,1,2,3,4,5}	// 可以简化成这样写

部分初始化:

// 定义了5的长度,最多给5个数据,可以少不可以多,否则报越界异常,初始化是按照顺序的,写了两个,就等于索引0和1才有数据,其它都是默认0
arr := [5] int {1,2}

指定元素初始化:

数组名 := [元素数量] 数据类型 {索引1:数据,索引2:数据}
arr := [5] int {0:1,1:2}

数组长度不确定,可以使用...代替数组的长度,编译器会根据元素个数自行推断数组的长度:

数组名 := [...] 数据类型{数据1,数据2,数据3}
arr := [...] int {0:1,1:2}

访问数组元素:

数组名 [索引]
arr[0]

演示:

func main() {
	// 仅定义,未初始化
	var arr [5]int
	fmt.Println("arr的数据:", arr)

	// 静态初始化格式1:
	var arr2 [5]int = [5]int{1, 2, 3, 4, 5}
	fmt.Println("初始化格式1:", arr2, arr2[1])

	// 静态初始化格式2:
	arr3 := [5]int{1, 2, 3, 4, 5}
	fmt.Println("初始化格式2:", arr3[1])

	// 部分初始化:未初始化的数据自动填充默认值
	arr4 := [5]int{1, 2}
	fmt.Println("部分初始化:", arr4, arr[2])

	// 指定索引初始化:
	arr5 := [5]int{0: 1, 1: 2}
	fmt.Println("部分初始化:", arr5, arr5[0])

	// 类型推导:三个点就像是变参一样
	arr6 := [...]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
	fmt.Println("推导类型:", arr6, arr6[1])

	// 初始化也可以先定义,再逐个赋值
	var arr7 [5]int
	arr7[0] = 1
	arr7[1] = 2
	fmt.Println("arr7:", arr7)
}

输出:

arr的数据: [0 0 0 0 0]
初始化格式1[1 2 3 4 5] 2
初始化格式22
部分初始化: [1 2 0 0 0] 0
部分初始化: [1 2 0 0 0] 1
推导类型: [1 2 3 4 5 6 7 8 9 10] 2
arr7: [1 2 0 0 0]

数组是值类型,传递后不会被修改原数组的数据

func main() {
	arr := [...]int{1, 2, 3, 4, 5}
	NewArr := arr // 赋值给一个新的数组
	NewArr[0] = 100
	fmt.Println("arr:", arr) // arr: [1 2 3 4 5]
	fmt.Println("NewArr:", NewArr) //NewArr: [100 2 3 4 5]
}

输出:

arr: [1 2 3 4 5]
NewArr: [100 2 3 4 5]

如果数组元素类型支持==、!=操作符,那么数组也支持比较操作

func main() {
	var a, b [2]int
	fmt.Printf("a的数据类型%T\t b的数据类型%T\n", a, b) // a的数据类型[2]int        b的数据类型[2]int

	fmt.Println("a == b", a == b) // a == b true

	c := [2]int{1, 2}
	d := [2]int{2, 3}
	fmt.Println("c == d", c == d) // false

	var e ,f [2] map[string]int
	fmt.Println(e==f) // 无效运算: e==f (在 [2]map[string]int 中未定义运算符 ==)
}

数组内存地址是数组中第一个元素的内存地址,各个元素之间的间隔是按照数组数据类型所占用的字节决定的,比如int64占用8个字节,那么数组中的每个元素内存地址之间间隔为8,因为int类型是占8个字节,所以每个变量的内存地址依次加8,而内存地址都是16进制计算的,所以结尾都是0和8(8+8=16 逢16进0)

func main() {
	arr := [4]int{1, 2, 3, 4}
	fmt.Printf("arrr的地址=%p\n  arr[0]地址=%p\n  arr[1]地址%p\n  arr[2]地址%p\n  arr[3]地址%p\n", &arr, &arr[0], &arr[1], &arr[2], &arr[3])
}

输出:

arrr的地址=0x1400012e000
arr[0]地址=0x1400012e000
arr[1]地址0x1400012e008
arr[2]地址0x1400012e010
arr[3]地址0x1400012e018

索引越界异常:

现在数组有5个元素,索引是0~4,如果去取索引5的值,就会报索引越界

func main() {
	var arr [5]int = [5]int{1, 2, 3, 4, 5}
	println(arr[5]) // 无效的 数组 索引 '5' (5 元素的数组超出界限)
}
  • 出现原因:数组长度为5,索引范围是0~4,但是却访问了一个5的索引。
  • 解决方案: 将错误的索引修改为正确的索引范围即可!

数组遍历:

数组遍历:就是将数组中的每个元素分别获取出来,就是遍历。

func main() {
	arr := [5]int{1, 2, 3, 4, 5}
	for i := 0; i < len(arr); i++ {
		fmt.Println(arr[i])
	}

	for i, v := range arr {
		fmt.Println("索引:", i, "值:", v)
	}
}

数组作为函数参数

函数中修改数组中的值,不会影响到原数组

格式:

func 函数名 (数组){函数体}

// 调用
函数名(数组)

演示:

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

func Demo(arr [5]int) {
	for _, v := range arr {
		fmt.Println("Value:", v)
	}
}

s

数组值比较:

func main() {
	b := Demo()
	if b {
		fmt.Println("数据相同")
	} else {
		fmt.Println("数据不同")
	}
}


func Demo() bool {
	b := true
	arr1 := [5]int{1, 2, 3, 4, 5}
	//arr2 := [5]int{1, 2, 3, 4, 5}
	arr2 := [5]int{6, 7, 8, 9, 10}

	// 先判断长度,再判断数据
	if len(arr1) == len(arr2) {
		// 长度一样就判断数据
		for i := 0; i < len(arr1); i++ {
			// 如果一样的话就跳过本次循环,继续下一个数据对比
			if arr1[i] == arr2[i] {
				continue
				// 数据不同则返回内容结束循环
			} else {
				b = false
				break
			}
		}
		// 长度不同则返回内容结束循环
	} else {
		b = false
	}
	return b
}

数组小案例:

数组获取最大值、最小值、求和:

实现思路:

  1. 定义最大值/最小值变量,初始值为数组的0索引,数组循环的时候会依次比较,如果比最大值大/比最小值小,就赋值给最大值/最小值变量
  2. 求和:定义变量,循环相加即可
  3. 平均数不要直接除数组长度,要用len

演示:

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

	// 定义最大值、最小值、求和变量
	max := arr[0]
	min := arr[0]
	sum := 0

	for i := 0; i < len(arr); i++ {
		// 判断数组的元素是否大于自定义的最大值,如果是就把值赋值给max,作为当前最大值
		if arr[i] > max {
			max = arr[i]
			// 判断数组的元素是否小于自定义的最小值,如果是就把值赋值给min,作为当前最小值
		} else if arr[i] < min {
			min = arr[i]
		}
		sum += arr[i]
	}
	fmt.Println("最大值:", max)
	fmt.Println("最小值:", min)
	fmt.Println("数组数据总和:", sum)
	fmt.Println("平均值:", sum/len(arr))
}
判断最长的元素
func main() {
	arr := [...]string{"娜可露露", "雅典娜", "韩信", "李白"}
	max := arr[0]
	for i := 0; i < len(arr); i++ {
		if len(arr[i]) > len(max) {
			max = arr[i]
		}
	}
	fmt.Println(max)
}

多维数组:

二维数组:

二维数组也是一种容器,不同于一维数组,该容器存储的都是一维数组

全部初始化格式:

// m:表示这个二维数组,可以存放多少个一维数组 n:表示每一个一维数组,可以存放多少个元素
var 变量名 [m] [n] int = [m] [n] int {{一维数组数据},{一维数组数据}}
变量名 := [m] [n] int {{一维数组数据},{一维数组数据}}// 简写

部分初始化格式:

// 没有被初始化的索引系统会赋上默认值
var 变量名 = [m] [n] int {{一维数组数据},{一维数组数据}}

指定初始化格式:

// 没有被初始化的索引系统会赋上默认值
var 变量名 = [m] [n] int {n{索引:数据},n{索引:数据}}

演示:

func main() {
	// arr是一个二维数组,里面存了2个一维数组,每个一维数组的长度是3
	arr := [2][3]int{{1, 2, 3}, {4, 5, 6}}
	arr2 := [2][3]int{{1, 2}, {4}}
	arr3 := [2][3]int{0: {0: 1, 1: 2, 2: 3}, 1: {0: 4, 1: 5, 2: 6}}
	//arr4 := [...][...]int{{1, 2, 3}, {4, 5, 6}, {1, 2, 3}, {4, 5, 6}} //  一维数组个数可以用... 但是一维数组长度不可以
	arr4 := [...][3]int{{1, 2, 3}, {4, 5, 6}, {1, 2, 3}, {4, 5, 6}}
	
	fmt.Println("arr:", arr, "\tarr[0]:", arr[0], "\tarr[1]:", arr[1])
	fmt.Println("arr2:", arr2, "\tarr2[0]:", arr2[0], "\tarr2[1]:", arr2[1])
	fmt.Println("arr3:", arr3, "\tarr3[0]:", arr3[0], "\tarr3[1]:", arr3[1])
	fmt.Println("arr4:", arr4, "\tarr4[0]:", arr4[0], "\tarr4[1]:", arr4[1])
}

输出:

arr: [[1 2 3] [4 5 6]]         arr[0]: [1 2 3]         arr[1]: [4 5 6]
arr2: [[1 2 0] [4 0 0]]        arr2[0]: [1 2 0]        arr2[1]: [4 0 0]
arr3: [[1 2 3] [4 5 6]]        arr3[0]: [1 2 3]        arr3[1]: [4 5 6]
arr4: [[1 2 3] [4 5 6] [1 2 3] [4 5 6]]        arr4[0]: [1 2 3]        arr4[1]: [4 5 6]

内置函数len和cap都返回第一纬度长度

func main() {
	a := [2]int{}
	b := [...][2]int{{10, 20}, {30, 40}, {50, 60}}
	println(len(a), cap(a))
	println(len(b), cap(b))
	println(len(b[1]), cap(b[1]))
}

输出:

2 2
3 3
2 2

二维数组遍历:

len(二维数组名):打印一维数组个数
len(二维数组[索引]):打印一维数组的长度

演示:

func main() {
	arr := [2][3]int{{1, 2}, {4, 5, 6}}
	fmt.Println(len(arr))    // 一维数组的个数
	fmt.Println(len(arr[1])) // 一维数组的长度

	for i := 0; i < len(arr); i++ { // 外循环是二维数组
		for j := 0; j < len(arr[i]); j++ { // 内循环是一维数组
			fmt.Print(arr[i][j])
		}
	}

	for i, v := range arr {
		fmt.Println("数组:", i, "值:", v)
	}

	for _, v := range arr {
		fmt.Println(v)
		for _, data := range v {
			fmt.Println(data)
		}
	}
}
三维数组:
func main() {
	arr := [3][3][3]int{{}}
	fmt.Println(arr)
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Go_数组遍历、最大值、求和、多维数组 的相关文章

  • Go内存管理及性能观测工具

    内存管理 TCMalloc Golang内存分配算法主要源自Google的TCMalloc算法 TCMalloc将内存分成三层最外层Thread Cache 中间层Central Cache 最里层Page Heap Thread Cach
  • Golang教程:(十六)结构体

    原文 https golangbot com structs 欢迎来到Golang系列教程的第十六篇 什么是结构体 结构体 struct 是用户自定义的类型 它代表若干字段的集合 有些时候将多个数据看做一个整体要比单独使用这些数据更有意义
  • Go的并发的退出

    有时候我们需要通知goroutine停止它正在干的事情 比如一个正在执行计算的web服务 然而它的客户端已经断开了和服务端的连接 Go语言并没有提供在一个goroutine中终止另一个goroutine的方法 由于这样会导致goroutin
  • 【Golang入门】Golang第一天心得

    生活所迫 入门一下Go 很奇葩的第一点 接口 package main import fmt 定义一个接口 type Shape interface Area float64 定义一个矩形类型 type Rectangle struct W
  • Go开发命令行程序指南

    近期在Twitter上看到一个名为 Command Line Interface Guidelines 的站点 1 这个站点汇聚了帮助大家编写出更好命令行程序的哲学与指南 这份指南基于传统的Unix编程原则 2 又结合现代的情况进行了 与时
  • Golang适合高并发场景的原因分析

    典型的两个现实案例 我们先看两个用Go做消息推送的案例实际处理能力 360消息推送的数据 16台机器 标配 24个硬件线程 64GB内存 Linux Kernel 2 6 32 x86 64 单机80万并发连接 load 0 2 0 4 C
  • Jenkins系列:3、wsl/ubuntu安装Jenkins及Jenkins构建可交叉编译的go程序

    Jenkins系列 3 wsl ubuntu安装Jenkins及Jenkins构建可交叉编译的go程序 文章目录 Jenkins系列 3 wsl ubuntu安装Jenkins及Jenkins构建可交叉编译的go程序 1 前言 2 wsl
  • golang:环境变量GOPROXY和GO111MODULE设置

    我们安装完golang后 我们在windows的cmd命令下就可以直接查看和使用go命令和环境变量了 同样的在linux下可以在控制台使用 如下图所示 C Users lijie1 gt go env set GO111MODULE set
  • Go 语言输出文本函数详解

    Go语言拥有三个用于输出文本的函数 Print Println Printf Print 函数以其默认格式打印其参数 示例 打印 i 和 j 的值 package main import fmt func main var i j stri
  • Go 语言注释教程

    注释是在执行时被忽略的文本 注释可用于解释代码 使其更易读 注释还可用于在测试替代代码时防止代码执行 Go支持单行或多行注释 Go单行注释 单行注释以两个正斜杠 开头 在 和行尾之间的任何文本都将被编译器忽略 不会被执行 示例 This i
  • 【go语言开发】编写单元测试

    本文主要介绍使用go语言编写单元测试用例 首先介绍如何编写单元测试 然后介绍基本命令的使用 最后给出demo示例 文章目录 前言 命令 示例 前言 在go语言中编写单元测试时 使用说明 测试文件命名 在 Go 语言中 测试文件的命名应与被测
  • 【go语言开发】loglus日志框架的使用

    本文将简单介绍loglus框架的基本使用 并给出demo 文章目录 前言 Loglus常见用法 自定义日志级别 使用字段钩子 输出到多个位置 使用钩子实现自定义日志处理 demo
  • go-zero开发入门之网关往rpc服务传递数据2

    go zero 的网关服务实际是个 go zero 的 API 服务 也就是一个 http 服务 或者说 rest 服务 http 转 grpc 使用了开源的 grpcurl 库 当网关需要往 rpc 服务传递额外的数据 比如鉴权数据的时候
  • go-zero开发入门之网关往rpc服务传递数据1

    go zero 的网关往 rpc 服务传递数据时 可以使用 headers 但需要注意前缀规则 否则会发现数据传递不过去 或者对方取不到数据 go zero 的网关对服务的调用使用了第三方库 grpcurl 入口函数为 InvokeRPC
  • go-zero开发入门之gateway深入研究1

    创建一个 gateway 示例 main go package main import flag fmt gateway middleware github com zeromicro go zero core conf github co
  • “go mod tidy”之错误“not a valid zip file”

    执行 go mod tidy 时 遇到如下错误 rpc imports github com zeromicro go zero zrpc imports github com zeromicro go zero zrpc resolver
  • 协程-单线程内的异步执行

    1 仿协程实例 不同事件依次顺序执行 coding utf 8 import time def calculate 1 step event name for index in range step print This is s even
  • Golang拼接字符串性能对比

    g o l a n g golang g o l an g
  • golang 生成一年的周数

    GetWeekTimeCycleForGBT74082005 获取星期周期 中华人民共和国国家标准 GB T 7408 2005 参数 year 年份 GB T 7408 2005 func GetWeekTimeCycleForGBT74
  • 【go语言】结构体数据填充生成md错误码文件

    这里使用pongo2这个模版引擎库进行md文件渲染 GitHub flosch pongo2 Django syntax like template engine for Go package main import fmt github

随机推荐

  • 推荐学习方法——费曼技巧,以教促学,教学相长

    1 说到费曼技巧先来了解一下费曼这个人 费曼 全名理查德 费曼 美国著名物理学家 于1965年获得诺贝尔物理奖 在沉迷于美妙的物理世界的同时 他还热衷于教育事业 喜欢向人们深入浅出的讲解艰深的物理知识 在他的自传里 他提到曾纠结于某篇艰深的
  • java的反射机制

    Java的反射机制 1 定义 指程序可以访问 检测并修改本身的状态或行为的一种能力 并能根据自身行为的状态和结果调整或修改应用所描述行为的状态和相关的语义 简单来说 就是一种能自我修正的机制 2 意义 首先 反射机制极大的提高了程序的灵活性
  • 如何开启VT方法

    第 步 进入BOIS 重启电脑后 屏幕刚亮 笔记本一般快速按F1或F12 台式一般按DEL键 多按几下 成功后 会进入BIOS设置页面 第 步 找到 Intel Virtualization Technology 把 Disabled 修改
  • 跨平台方案Flutter入门——开发环境搭建

    目录 系统配置要求 获取 Flutter SDK 配置环境变量 安装 Android Studio 运行 flutter doctor 1 Anroid 的 SDK 路径 2 许可未同意 Android Studio 安装插件 Androi
  • 快来动手训练属于自己的聊天机器人吧!

    活动时间 北京时间2023年3月16日15 00 17 00 活动形式 在线直播 动手训练营 动手实践 使用 Amazon SageMaker 构建基于开源 GPT J 模型的对话机器人应用 难度 入门 时间 20 分钟 开发者可以使用 A
  • Python 遇到的问题

    目录 问题1 Pycharm 项目中 Cannot find declaration to go to 问题2 TypeError list indices must be integers or slices not tuple
  • 【C++】继承

    需要云服务器等云产品来学习Linux的同学可以移步 gt 腾讯云 lt gt 阿里云 lt gt 华为云 lt 官网 轻量型云服务器低至112元 年 新用户首次下单享超低折扣 目录 一 继承的概念 二 被继承成员访问方式的变化 三 赋值兼容
  • 详解不带参数的 Math.max() 返回 -Infinity

    Math max 是内置的 JavaScript 函数 从给定的一组数字中返回最大值 其语法如下 Math max value1 value2 例如 让我们从 1 2 以及 3 中找到最大的数字 Math max 1 2 3 gt 3 正如
  • [架构之路-199] - 可靠性需求与可靠性分析:鱼骨图、故障树分析法FTA、失效模式与影响DFMEA,找到影响故障的主要因素

    目录 引言 第1章 故障树分析法与鱼骨图的比较 1 1 相同点 1 2 区别点 第2章 鱼骨图 第3章 故障树 3 1 示意图 3 2 故障树解读 3 3 故障树常见符号 第4章 产品失效 Failure 模式分析DFMEA 引言 目标系统
  • git The following paths are ignored by one of your .gitignore files: Use -f if you really want to ad

    git 右键或者命令add 文件或目录 不允许提交 提示 The following paths are ignored by one of your gitignore files Use f if you really want to
  • msvcp140.dll重新安装的解决方法(一键安装方法)

    msvcp140 dll电脑文件中的dll文件 即动态链接库文件 若计算机中丢失了某个dll文件 就会导致某些软件和游戏等程序无法正常启动运行 并且导致电脑系统弹窗报错 其安装方法 1 打开浏览器输入 dll修复程序 site 并下载安装m
  • 计算机二级准考证打印通道,2019年9月计算机二级准考证打印快速入口

    2019年9月份为全国计算机等级考试时间 各省从9月11日起陆续开始打印准考证 考生与9月8日起登入打印入口进行打印 考点报名者在考点领取即可 下面我们快来看看北京 上海 陕西 吉林等各省市的打印时间和打印入口在哪 1 各省计算机二级准考证
  • Redis 7 第九讲 微服务集成Redis 应用篇

    Jedis 理论 Jedis是redis的java版本的客户端实现 使用Jedis提供的Java API对Redis进行操作 是Redis官方推崇的方式 并且 使用Jedis提供的对Redis的支持也最为灵活 全面 不足之处 就是编码复杂度
  • Java 区块链BLOCKCHAIN中区块BLOCK的hash值的计算

    Java 区块链中区块的hash值的计算 计算方法有多种 如 可以直接String拼接 也可以用stringbuffer 或者stringbuilder 这里采用了速度较快的stringbuilder 自己编程的时候可采用stringbuf
  • 实验:使用SSMS创建并管理数据库及其基本表(代码版)

    目录 一 实验要求 1 使用SQL命令创建学生课程 SCC 数据库 2 使用SQL命令学生课程数据库中的学生表 S 课程表 C 选课表 SC 并保存关闭设计窗口 3 使用SQL命令修改基本表结构 即增加和删除列 4 使用SQL命令创建及管理
  • Everything+cpolar内网穿透轻松实现公网远程访问本地硬盘文件

    公网远程访问本地硬盘文件 内网穿透 文章目录 公网远程访问本地硬盘文件 内网穿透 前言 1 下载cpolar和Everything软件 3 设定http服务器端口 4 进入cpolar的设置 5 生成公网连到本地内网穿透数据隧道 总结 前言
  • Request和ThreadLocal

    Web容器中有三个周期 request Httpsession application 其中request是客户端发出的一个请求 这个request的载体就是一个 线程 实际等同于一个线程的生命周期 Request是封装在线程上面一个抽象概
  • windows下pip安装mysqlclient失败

    环境 windows8家庭版 python3 6 7 在虚拟环境中pip install mysqlclient报错 解决方案 下载地址 ctrl f键入mysqlclient 找到对应的版本即可 博主是python3 6 7 所以选择了倒
  • 2021 程序媛跳槽记:学习计划篇

    三妹跳槽系列文章 2021 程序媛跳槽记 百度阿里字节等各大厂面经篇 2021 程序媛跳槽记 必刷LeetCode算法题 附解题报告 坦白说 我这个人不算聪明 基础也不咋样 这次跳槽我一开始是很没信心的 甚至想把这次尝试当做试水 如果受打击
  • Go_数组遍历、最大值、求和、多维数组

    数组 数组就是用来存储数据的容器 存储多个数据时数据类型要一致 如果想要保存任意类型数据 需要声明为接口类型数组 数组定义完成后 可以对数组进行赋值操作 数组是通过下标来进行操作的 下标的范围是从0开始到数组长度减1的位置 特点 数组是一种