当前位置: 首页 > news >正文

golang的数组

数组

数组的价值

在编程中,常常会需要处理一堆同类事物,并对每个个体都有记录要求的时候,此时,如果采用传统方法(一个个体对应一个变量),那就需要定义大量的变量,这严重影响了代码的可读性和可维护性。
此时,就是数组大展身手的时刻,数组能够轻松的记录大量同类事物

数组的介绍

数组可以存放多个同一类型的数据,数组也是一种数据类型,在go中数组是值类型
fmt.Printf(“%v\n”, hen)的输出结果为:[3 4 5 6 7 8]。这也明确表示数组是值类型,直接返回的是数组的值。

数组的快速入门

func main() {
var hen [6]float64
var sum float64
for i := 0; i < len(hen); i++ {
hen[i] = 3.0 + float64(i)
sum += hen[i]
}
fmt.Printf(“%v”, sum/float64(len(hen)+1))
}
用于处理求平均问题

数组定义

var 数组名[数组大小]数据类型
var a[5]int

数组的内存布局

数组名就是数组的首地址,也就是数组第一个元素的地址
fmt.Printf(“%p,%p,%p,%p”, &hen, &hen[0], &hen[1], &hen[2])
返回的结果是:0xc00000c4b0,0xc00000c4b0,0xc00000c4b8,0xc00000c4c0
可见&hen, &hen[0]这两个的值一样。
亦可见,数组的地址其实是连续的,因为float64是8个字节,所以每下一个元素的地址,就会在上一个元素的地址上+8;同理,如果是float32,那就是在上一个元素的地址的基础上+4

数组的使用

当要查询数组a的第i个元素时,使用a[i-1]的形式获取

因为数组在使用时是调用索引(下标的),而第i个元素对应的下标是i-1

四种初始化数组的方式

  1. var a [3]int =[3]int {1,2,3}
  2. var a =[3]int {1,2,3}
  3. var a =[…]int {1,2,3}
  4. var name = [3]string {1:“tom”,0:“lsh”,2:“zjw”}

数组的遍历

  1. 传统用for语句
  2. go中的for-range语句
    基本语法:
    for index,value :=range array{

    }
    第一个返回值index是数组的下标
    value是该下标的值
    index和value都是只在for循环内部可见的局部变量
    遍历数组元素时,如果不想使用index,可以用下划线(占位符)代替
    index和value不是固定的,程序员可以自己决定,但一般是这样的

数组使用的细节和注意事项

  1. 数组是多个相同数据类型数据的组合,一个数组一旦声明/定义了,其长度就是固定不变的,不能动态变化
  2. var a []int,此时的a是一个切片。如果是数组的话,那中括号内必须要有这个数组的大小
  3. 数组中的元素可以是任何类型,包括值类型和引用类型,但是只能是相同的类型
  4. 数组创建后,如果没有初始化赋值,就存储默认值
    int,float系列默认值0
    bool默认值false
    string默认值""(空字符串)
  5. 使用数组的流程:
    1. 声明数组并开辟空间
    2. 给数组各个元素赋值(不赋值就是默认值)
    3. 使用数组
  6. 数组的下标是从0开始
  7. 数组下标必须在范围内使用,否则会报panic:数组越界

比如说,如果数组的大小是10,那么下标的范围就是0-9

  1. go中的数组是值类型,在一般情况下是值传递,因此会进行值拷贝,也就是说,当把数组传入函数时,函数内部的代码无法对函数外部这个数组的值产生影响

代码示例:
func test(arr [3]int) {小知识点:在golang中,arr [3]int和arr [4]int完全是两个东西,所以在传入数组时,切忌要加上数组长度
arr[0] = 2
dizhi := &arr[1]
*dizhi = 10
}
func main() {
var arr [3]int
arr[0] = 1
arr[1] = 3
arr[2] = 2
test(arr)
fmt.Println(arr)
}

输出结果为:[1 3 2]
显然,函数内部哪怕通过地址也无法改变传入的数组的值。

原因:
因为在go中,在向函数传入数组时,系统内存会在栈中划分出一块给这个函数的空间,在这个空间自动浅拷贝一个内容一模一样,但是地址不同的数组。也就是和传入int,float系列一样的效果

  1. 如果非要在函数中改变外部数组的值,那么只能通过传引用类型(指针)的方式,比如说数组的地址
  2. 在go中,长度是数组类型的一部分,在传递函数时,一定要带上长度。同第8点中高亮的小知识点
http://www.dtcms.com/a/314725.html

相关文章:

  • SpringBoot-手动配置环境
  • VUE2 学习笔记17 路由
  • 一起学springAI系列一:流式返回
  • 嵌入式 - 数据结构:查找至双向链表
  • CUDA后端错误的根源与系统性解决方案
  • python文件操作:写入内容write
  • Linux 服务器性能监控、分析与优化全指南
  • Linux 安装与配置 MySQL 教程
  • 项目实战二:RPC
  • 自制简易SHELL
  • 数据结构:单向链表、双向链表
  • Java中给List<T> 对象集合去重
  • 深化中坦经贸合作 谱写东非璀璨新篇!东非商贸物流中心(EACLC)正式启航
  • Baumer工业相机堡盟工业相机如何通过YoloV8深度学习模型实现路口车辆速度的追踪识别(C#代码UI界面版)
  • 通过java将 word(.doc) 转 md
  • Java数组转换为逗号分隔字符串的方法
  • dbeaver导入数据及配置讲解
  • 通过 Flink 和 CDC 从 Oracle 数据库获取增量数据,并将这些增量数据同步到 MySQL 数据库中
  • Go 与 Python 爬虫代码实操对比
  • # 自动定时运行Python爬虫脚本教程(Windows任务计划程序)
  • LED光源模拟太阳光,全新科技照亮未来
  • 解决 GitLab external_url 修改无效的问题:保留数据重新生成配置
  • 一(2)关于单链表中的疑问 head = head->next; 和 head->next = head 的核心区别
  • 张宇高数基础30讲与1000题学习笔记(第4-6章)
  • LeetCode:219.存在重复元素||220.存在重复元素|||
  • SpringDoc OpenAPI 3 和 TestContainers 的 零配置自动化API测试方案,实现从API文档生成
  • 安全策略实验报告
  • ensp防火墙用户认证综合实验
  • AI开灯的几种方法,与物理世界的交互过渡
  • 生成式人工智能展望报告-欧盟-06-深度调研-医疗、教育、网络安全