【30天熟悉Go语言】11 数组的全方位使用与解析
作者:秃秃爱健身,多平台博客专家,某大厂后端开发,个人IP起于源码分析文章 😋。
源码系列专栏:Spring MVC源码系列、Spring Boot源码系列、SpringCloud源码系列(含:Ribbon、Feign)、Nacos源码系列、RocketMQ源码系列、Spring Cloud Gateway使用到源码分析系列、分布式事务Seata使用到源码分析系列、JUC源码系列
基础系列专栏:30天熟悉GO语言(建设中)
码文不易,如果感觉博主的文章还不错,请点赞👍、收藏 ⭐️支持一下博主哇 🙏
联系方式:Saint9768,加我进技术交流群,一起学习进步📚、freedom✈️🌊
文章目录
- 一、前言
- 二、数组
- 1、数组定义
- 2、数组初始化
- 1)使用数组字面量初始化数组
- 2)GO自动计算数组的长度
- 3)指定特定元素的值
- 3、数组内存分析
- 4、数组使用
- 1)访问数组元素
- 2)同类型数组赋值
- 3)将数组按引用传递
- 5、数组遍历
- 三、二维数组
- 1、定义&赋值
- 2、初始化
- 四、总结
一、前言

Go系列文章:
- GO开篇:手握Java走进Golang的世界
- 2 Go开发环境搭建、Hello World程序运行
- 3 Go编程规约和API包
- 4 Go的变量、常量、运算符
- 5 Go 基本数据类型
- 6 Go 复杂数据类型之指针
- 7 Go流程控制之分支结构if、switch
- 8 Go流程控制之循环结构for range、goto、break、continue
- Go函数全方位解析
- Go异常处理机制
Go专栏传送链接:https://blog.csdn.net/saintmm/category_12326997.html
二、数组
在GO语言中,数组是一个长度固定的数据类型,用于存储相同类型的数据
1、数组定义
数组声明时需要指定内部存储的数据的类型,需要存储的元素的数量。数组声明完成之后,每个数组元素的默认值都是对应类型的零值。
数组定义格式:var arrayName [数组大小]数据类型
例如:声明一个包含3个元素的整型数组。
var array 3[int]
2、数组初始化
数组的初始化有三种方式:使用数组字面量、自动计算数组长度、指定特定索引位置元素的值。
1)使用数组字面量初始化数组
初始化一个包含3个元素的整型数组
var arr1 [3]int = [3]int{3,6,9}
fmt.Println(arr1)
或:
var arr2 = [3]int{1,2,3}
fmt.Println(arr2)
2)GO自动计算数组的长度
使用... 代替数组的长度,GO会根据初始化时数组元素的数量来确定该数组的长度。
arr3数组的长度为4。
var arr3 = [...]int{1,3,5,7}
fmt.Println(arr3)
3)指定特定元素的值
在已知数组长度的前提下,可以给数组的特定索引位置指定具体的值。
下面初始化一个长度为3的数组,并乱序指定索引0和索引2位置的元素值分别为3,9。
var arr4 = [...]int{2:9, 0:3}
fmt.Println(arr4)
3、数组内存分析
数组开辟的内存空间是一块连续的内存空间,其访问/修改效率很高。
示例:
package mainimport "fmt"func main() {// 定义数组var arr [3]int32// 打印数组fmt.Println(arr)// arr的内存地址值fmt.Printf("arr的地址为:%p", &arr)fmt.Println()// arr[0]内存地址值fmt.Printf("arr[0]的地址为:%p", &arr[0])fmt.Println()// arr[1]内存地址值fmt.Printf("arr[1]的地址为:%p", &arr[1])fmt.Println()// arr[2]内存地址值fmt.Printf("arr[2]的地址为:%p", &arr[2])
}
输出:

内存使用解析:
示例中 int32类型的数组arr,内存地址为0xc00001a0c0,则arr[n]的内存地址为 0xc00001a0c0 + 4*n

4、数组使用
1)访问数组元素
要访问数组里的某个元素,使用[]运算符。
package mainimport "fmt"func main() {arr1 := [3]int{1,2,3}fmt.Println("arr1[0]的值为:", arr1[0])
}
输出:

2)同类型数组赋值
可以把同样类型的一个数组赋值给另外一个数组。
// 声明一个包含3个元素的整型数组
var arr [3]int32arr1 := [3]int32{1,2,3}// 把arr1的值赋值给arr
arr = arr1
注意:数组长度属于类型的一部分,即:数组变量的类型包括两步分:数组长度和每个元素的类型,只有这两部分都相同的数组,才是类型相同的数组,才能互相赋值。
package mainimport "fmt"func main() {arr1 := [3]int{1,2,3}fmt.Printf("arr1数组的类型为:%T\n", arr1)arr2 := [6]int{1,2,3,4,5,6}fmt.Printf("arr2数组的类型为:%T\n", arr2)
}

从输出来看:arr1和arr2的类型分别为[3]int、[6]int。
此外,编译器会阻止类型不同的数组互相赋值。

3)将数组按引用传递
在go中数据属于值类型,默认情况下按值传递,将数组作为参数在函数之间传递时,会进行值拷贝;
package mainimport "fmt"func main() {arr1 := [3]int{1,2,3}// 数组默认按值传递,函数不会改变arr1的元素值changeArrayValue(arr1)fmt.Println("arr1数组为:", arr1)
}
func changeArrayValue(arr [3]int) {arr[0] = 7
}
输出:

- 从输出内容可以得知,函数间默认传递数据的方式是按值传递;在子函数(
changeArrayValue)中修改数组,不会影响父函数(main)中数组的值。
根据内存和性能来看,在函数见传递数组是一个开销很大的操作。因此我们可以选择使用指针在函数间传递数组。
package mainimport "fmt"func main() {arr1 := [3]int{1,2,3}// 使用指针的方式做引用传递,函数会改变arr1的元素值changeArrayValueByPointer(&arr1)fmt.Println("arr1数组为:", arr1)
}func changeArrayValueByPointer(arr *[3]int) {arr[0] = 7
}
输出:

- 将数组以指针的方式传递时,数组都指向同一组数据,子函数中修改数组的元素值,父函数中可以感知到。
5、数组遍历
两种遍历方式:普通for循环、for range。
示例:
package mainimport "fmt"func main() {// 定义数组var scores [4]intscores[0] = 99scores[1] = 97scores[2] = 89scores[3] = 91// 遍历数组// 方法一:普通for循环for i :=0; i< len(scores); i++ {fmt.Println(scores[i])}fmt.Println()// 方法二:for rangefor key,value := range scores {fmt.Printf("第%d个学生的成绩的为:%d\n", key, value)}
}
输出:

三、二维数组
二维数组、乃至多维数组,本质上只是一维数组中的元素值变成了数组,故多维数组的特性和一维数组保持一致。二维数组的遍历也是两种方式:普通for循环、for range。
此处我们介绍一下二维数组的声明、初始化。
1、定义&赋值
package mainimport "fmt"func main() {// 定义数组var arr [2][3]int32fmt.Println(arr)fmt.Printf("arr的地址为:%p\n", &arr)fmt.Printf("arr[0]的地址为:%p\n", &arr[0])fmt.Printf("arr[0][0]的地址为:%p\n", &arr[0][0])fmt.Printf("arr[1]的地址为:%p\n", &arr[1])fmt.Printf("arr[1][0]的地址为:%p\n", &arr[1][0])// 赋值arr[0][1] = 12
}

2、初始化
初始化方式和一维数组一样
// 使用数组字面量初始化数组
var arr1 [2][3]int32 = [2][3]int32{{1,2,3},{4,5,6}}
fmt.Println(arr1)

四、总结
本文内容从数组的定义、初始化 到 数组使用 以及 数组的内存分析。
数组的初始化方式有三种:数组字面量、不定长数组、指定特定元素值;数组的同类型是指两个数组长度相等、元素值类型相等。
另外,数组默认是按值传递,可以使用传递数组指针的方式实现按引用传递。
相关文章:
【30天熟悉Go语言】11 数组的全方位使用与解析
作者:秃秃爱健身,多平台博客专家,某大厂后端开发,个人IP起于源码分析文章 😋。 源码系列专栏:Spring MVC源码系列、Spring Boot源码系列、SpringCloud源码系列(含:Ribbon、Feign&…...
静态路由(详细理解+实例精讲)
系列文章目录 华为数通学习(6) 前言 一,静态路由 二,静态路由配置 三,缺省路由 四,缺省路由应用场景 总结 前言 随着华为公司的不断发展,数据通信这门技术也越来越重要,很多人…...
leetcode做题笔记118. 杨辉三角
给定一个非负整数 numRows,生成「杨辉三角」的前 numRows 行。 在「杨辉三角」中,每个数是它左上方和右上方的数的和。 思路一:动态规划 int** generate(int numRows, int* returnSize, int** returnColumnSizes){int **returnnum(int **)…...
stm32之24.RTC闹钟usart端口修改配置
(需要修改) 源码 while(1){//rtc唤醒事件if(g_rtc_wakeup_event){//获取日期RTC_GetDate(RTC_Format_BCD,&RTC_DateStructure);printf("20%02x/%02x/%02xWeek:%x\r\n",RTC_DateStructure.RTC_Year,RTC_DateStructure.RTC_Month,RTC_Date…...
Spring Security无法调用接口错误解决
之前在写程序的时候,发现有个接口使用postmapping发送请求一直无法进行调用 PostMapping("/user/login")public ResponseResult login(User user){//登录,这里登录的时候需要传入用户名和密码System.out.println("user "user.toSt…...
运维Shell脚本小试牛刀(二)
运维Shell脚本小试牛刀(一) 运维Shell脚本小试牛刀(二) 运维Shell脚本小试牛刀(三)::$(cd $(dirname $0); pwd)命令详解 一: if---else.....fi 条件判断演示 [rootwww shelldic]# cat checkpass.sh #!/bin/bash - # # # # FILE: ch…...
飞天使-python的模块与包与装饰器
文章目录 模块与包标准模块第三方模块自定义模块 高级语法切片迭代器/生成器高级模式(闭包)高级模式(装饰器) 参考视频 模块与包 标准模块 import os print(os.getcwd())import sys print(sys.argv) print(sys.platform) print(…...
linux shell脚本利用 kill -0 检查进程是否存在
1.kill -0介绍 kill -0 pid用来检查进程是否存在,kill -0 pid解释(来自man kill):“If sig is 0, then no signal is sent, but error checking is still performed.”不发送任何信号,但是系统会进行错误检查。 kill -0 pid ->若存在&am…...
抖音视频删了怎么在电脑上找回来
【昨天整理电脑文件时,不小心将剪辑好的抖音作品误删了,但是回收站中找不回来了,这些视频是我花了很多心血制作的,如果没了真的十分可惜!希望大家能帮帮我,告诉我应该如何恢复这些文件。】 现在人们都喜欢…...
方面级别情感分析之四元组预测
情感四元组预测现有方法 阅读本文之前我们默认你对情感分析有基本的认识。 如果没有请阅读文章(https://tech.tcl.com/post/646efb5b4ba0e7a6a2da6476) 情感分析四元组预测涉及四个情感元素: 方面术语a,意见术语(也叫观点术语)o, 方面类别ac,…...
算法 稀疏数组 数组优化 数组压缩 二维数组转稀疏数组 算法合集(二)
1. 五子棋游戏,玩家对战一半停战休息,此时需要存储当前对战双方棋子信息 a. 采用二维数组存储: 0为空, 1代表黑棋 2代表蓝色棋子 b. 棋盘为11行,11列 > int [][] chessArray new int [11][11]; c. 出现的问题&am…...
交换机端口安全实验
文章目录 一、实验的背景与目的二、实验拓扑三、实验需求四、实验解法1. PC配置IP地址部分2. 在SW1上开启802.1X身份验证3. 创建一个用户身份验证的用户。用户名为wangdaye,密码为1234564.创建一个端口隔离组,实现三台PC无法互相访问 摘要: 本…...
c# 本地化中英文切换
区域 线程默认区域为当前计算机所选区域 设置当前区域: Thread.CurrentThread.CurrentCulture new CultureInfo(“zh-cn”); 获取当前区域: Console.WriteLine(Thread.CurrentThread.CurrentCulture.ToString()); 区域名称: “zh-cn” 中文…...
rabbitmq的优先级队列
在我们系统中有一个 订单催付 的场景,我们的客户在天猫下的订单 , 淘宝会及时将订单推送给我们,如果在用户设定的时间内未付款那么就会给用户推送一条短信提醒,很简单的一个功能对吧,但是,tianmao商家对我们来说&#…...
SpringBoot的Cacheable缓存注解
当我们的应用程序需要频繁地读取和写入数据时,为了提高应用程序的性能,我们通常会使用缓存技术。Spring Boot 提供了一种简单而强大的缓存框架,它可以轻松地将数据缓存到 Redis 中。 在 Spring Boot 中可以在方法上简单的加上注解实现缓存。…...
uniapp的 picker 日期时间选择器
效果图: dateTimePicker.js function withData(param){return param < 10 ? 0 param : param; } function getLoopArray(start,end){var start start || 0;var end end || 1;var array [];for (var i start; i < end; i) {array.push(withData(i))…...
element ui-Pagination
页面分为两个表格,当两边的表格数据量大时,分页样式就会受到影响,可以将跳转按钮的个数减少 页面分页代码如下 页面效果...
[开发|java] 将数组使用环境变量传递配置给typesafe配置示例
参考文献 如何将一组值作为环境变量提供给 typesafe/lightbend 配置 示例 假设需要如下配置要设置环境传递 whitlist [/oauth/render,/oauth/callback]需要使用如下的方式传递到 conf 文件中: whitlist [] whitlist.0 /oauth/render whitlist.1 /oauth/render...
MAC苹果电脑如何压缩rar文件?
作为开发者,想必主力开发机肯定都以苹果的MacBook为主,究其原因,为非是因为其对开发者的友好性,且可同时进行iOS 以及android的app开发,但是windows在这方面就欠缺太多了,虽然很多人说可以使用,…...
浅析编程中的语法糖
1、理解语法糖 1.1.什么是语法糖? 语法糖是一种编程语言的特性,它并不引入新功能,而是通过提供更简洁、易读的语法形式,使代码编写和理解变得更加轻松。它有点像是一种“甜蜜”的语法,让我们在不改变底层逻辑的情况下…...
eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)
说明: 想象一下,你正在用eNSP搭建一个虚拟的网络世界,里面有虚拟的路由器、交换机、电脑(PC)等等。这些设备都在你的电脑里面“运行”,它们之间可以互相通信,就像一个封闭的小王国。 但是&#…...
零门槛NAS搭建:WinNAS如何让普通电脑秒变私有云?
一、核心优势:专为Windows用户设计的极简NAS WinNAS由深圳耘想存储科技开发,是一款收费低廉但功能全面的Windows NAS工具,主打“无学习成本部署” 。与其他NAS软件相比,其优势在于: 无需硬件改造:将任意W…...
在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能
下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能,包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...
Opencv中的addweighted函数
一.addweighted函数作用 addweighted()是OpenCV库中用于图像处理的函数,主要功能是将两个输入图像(尺寸和类型相同)按照指定的权重进行加权叠加(图像融合),并添加一个标量值&#x…...
uniapp中使用aixos 报错
问题: 在uniapp中使用aixos,运行后报如下错误: AxiosError: There is no suitable adapter to dispatch the request since : - adapter xhr is not supported by the environment - adapter http is not available in the build 解决方案&…...
【HarmonyOS 5 开发速记】如何获取用户信息(头像/昵称/手机号)
1.获取 authorizationCode: 2.利用 authorizationCode 获取 accessToken:文档中心 3.获取手机:文档中心 4.获取昵称头像:文档中心 首先创建 request 若要获取手机号,scope必填 phone,permissions 必填 …...
七、数据库的完整性
七、数据库的完整性 主要内容 7.1 数据库的完整性概述 7.2 实体完整性 7.3 参照完整性 7.4 用户定义的完整性 7.5 触发器 7.6 SQL Server中数据库完整性的实现 7.7 小结 7.1 数据库的完整性概述 数据库完整性的含义 正确性 指数据的合法性 有效性 指数据是否属于所定…...
处理vxe-table 表尾数据是单独一个接口,表格tableData数据更新后,需要点击两下,表尾才是正确的
修改bug思路: 分别把 tabledata 和 表尾相关数据 console.log() 发现 更新数据先后顺序不对 settimeout延迟查询表格接口 ——测试可行 升级↑:async await 等接口返回后再开始下一个接口查询 ________________________________________________________…...
【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的“no matching...“系列算法协商失败问题
【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的"no matching..."系列算法协商失败问题 摘要: 近期,在使用较新版本的OpenSSH客户端连接老旧SSH服务器时,会遇到 "no matching key exchange method found", "n…...
纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join
纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join 1、依赖1.1、依赖版本1.2、pom.xml 2、代码2.1、SqlSession 构造器2.2、MybatisPlus代码生成器2.3、获取 config.yml 配置2.3.1、config.yml2.3.2、项目配置类 2.4、ftl 模板2.4.1、…...
