百度360必应搜狗淘宝本站头条
当前位置:网站首页 > IT技术 > 正文

Go语言-数组(go语言数组长度)

wptr33 2025-03-20 20:08 22 浏览

在 Go 语言(Golang)中,数组(Array) 是一种固定长度的数据结构,它存储类型相同的元素。数组的长度在定义时就确定,无法改变。以下是 Go 语言中数组的基本用法和特点:


1.数组声明与初始化

(1) 基本声明

var arr [5]int  // 声明一个包含 5 个整数的数组,默认值为 0

(2) 直接初始化

arr := [5]int{1, 2, 3, 4, 5}  // 声明并初始化

(3) 省略长度(自动推导)

arr := [...]int{1, 2, 3, 4, 5}  // Go 自动推导数组长度

(4) 指定索引初始化

arr := [5]int{1: 10, 3: 20}  // 仅初始化索引 1 和 3,其余默认为 0
fmt.Println(arr)  // 输出: [0 10 0 20 0]

2.访问数组元素

arr := [3]int{10, 20, 30}
fmt.Println(arr[0])  // 访问第一个元素
arr[1] = 50          // 修改第二个元素
fmt.Println(arr)     // 输出: [10 50 30]

3.数组的长度

使用 len() 获取数组长度:

arr := [5]int{1, 2, 3, 4, 5}
fmt.Println(len(arr))  // 输出: 5

4.遍历数组

(1) 传统for循环

arr := [3]int{10, 20, 30}
for i := 0; i < len(arr); i++ {
    fmt.Println(arr[i])
}

(2) 使用range遍历

arr := [3]int{10, 20, 30}
for index, value := range arr {
    fmt.Printf("索引 %d: 值 %d\n", index, value)
}

5.数组是值类型

在 Go 语言中,数组是 值类型,意味着赋值或传递时,会 复制整个数组,而不是传递引用:

func modifyArray(arr [3]int) {
    arr[0] = 100  // 仅修改副本
}

func main() {
    a := [3]int{1, 2, 3}
    modifyArray(a)
    fmt.Println(a)  // 输出: [1 2 3],原数组未改变
}

如果想要修改原数组,可以使用 指针

func modifyArray(arr *[3]int) {
    arr[0] = 100  // 修改原数组
}

func main() {
    a := [3]int{1, 2, 3}
    modifyArray(&a)
    fmt.Println(a)  // 输出: [100 2 3]
}

6.多维数组

(1) 声明与初始化

var matrix [2][3]int  // 2 行 3 列的二维数组

matrix := [2][3]int{
    {1, 2, 3},
    {4, 5, 6},
}

(2) 访问多维数组

fmt.Println(matrix[0][1])  // 访问第一行第二个元素(输出: 2)

(3) 遍历多维数组

for i := 0; i < len(matrix); i++ {
    for j := 0; j < len(matrix[i]); j++ {
        fmt.Printf("%d ", matrix[i][j])
    }
    fmt.Println()
}

7.数组 vs 切片(slice)

Go 语言的 数组 长度固定,而 切片(slice) 是动态的、可变的,更常用。与数组不同,切片是 引用类型,共享底层数据:

arr := [5]int{1, 2, 3, 4, 5}
slice := arr[1:4]  // 创建切片 [2 3 4]
fmt.Println(slice)

如果需要灵活的数据结构,通常使用切片而不是数组。


总结

  • 数组长度固定,声明后不可更改。
  • 数组是值类型,赋值和函数传递时会复制整个数组。
  • 可以使用 for 或 range 遍历数组。
  • 多维数组可以嵌套,但不如切片灵活。
  • Go 语言更推荐使用 切片(slice) 代替数组。

适用于:

  • 固定大小的数据存储(如棋盘、矩阵)。
  • 需要避免额外的切片开销的高性能场景。

如果你的数据长度是动态的,建议使用 切片 代替数组!

相关推荐

MySQL进阶五之自动读写分离mysql-proxy

自动读写分离目前,大量现网用户的业务场景中存在读多写少、业务负载无法预测等情况,在有大量读请求的应用场景下,单个实例可能无法承受读取压力,甚至会对业务产生影响。为了实现读取能力的弹性扩展,分担数据库压...

Postgres vs MySQL_vs2022连接mysql数据库

...

3分钟短文 | Laravel SQL筛选两个日期之间的记录,怎么写?

引言今天说一个细分的需求,在模型中,或者使用laravel提供的EloquentORM功能,构造查询语句时,返回位于两个指定的日期之间的条目。应该怎么写?本文通过几个例子,为大家梳理一下。学习时...

一文由浅入深带你完全掌握MySQL的锁机制原理与应用

本文将跟大家聊聊InnoDB的锁。本文比较长,包括一条SQL是如何加锁的,一些加锁规则、如何分析和解决死锁问题等内容,建议耐心读完,肯定对大家有帮助的。为什么需要加锁呢?...

验证Mysql中联合索引的最左匹配原则

后端面试中一定是必问mysql的,在以往的面试中好几个面试官都反馈我Mysql基础不行,今天来着重复习一下自己的弱点知识。在Mysql调优中索引优化又是非常重要的方法,不管公司的大小只要后端项目中用到...

MySQL索引解析(联合索引/最左前缀/覆盖索引/索引下推)

目录1.索引基础...

你会看 MySQL 的执行计划(EXPLAIN)吗?

SQL执行太慢怎么办?我们通常会使用EXPLAIN命令来查看SQL的执行计划,然后根据执行计划找出问题所在并进行优化。用法简介...

MySQL 从入门到精通(四)之索引结构

索引概述索引(index),是帮助MySQL高效获取数据的数据结构(有序),在数据之外,数据库系统还维护者满足特定查询算法的数据结构,这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构...

mysql总结——面试中最常问到的知识点

mysql作为开源数据库中的榜一大哥,一直是面试官们考察的重中之重。今天,我们来总结一下mysql的知识点,供大家复习参照,看完这些知识点,再加上一些边角细节,基本上能够应付大多mysql相关面试了(...

mysql总结——面试中最常问到的知识点(2)

首先我们回顾一下上篇内容,主要复习了索引,事务,锁,以及SQL优化的工具。本篇文章接着写后面的内容。性能优化索引优化,SQL中索引的相关优化主要有以下几个方面:最好是全匹配。如果是联合索引的话,遵循最...

MySQL基础全知全解!超详细无废话!轻松上手~

本期内容提醒:全篇2300+字,篇幅较长,可搭配饭菜一同“食”用,全篇无废话(除了这句),干货满满,可收藏供后期反复观看。注:MySQL中语法不区分大小写,本篇中...

深入剖析 MySQL 中的锁机制原理_mysql 锁详解

在互联网软件开发领域,MySQL作为一款广泛应用的关系型数据库管理系统,其锁机制在保障数据一致性和实现并发控制方面扮演着举足轻重的角色。对于互联网软件开发人员而言,深入理解MySQL的锁机制原理...

Java 与 MySQL 性能优化:MySQL分区表设计与性能优化全解析

引言在数据库管理领域,随着数据量的不断增长,如何高效地管理和操作数据成为了一个关键问题。MySQL分区表作为一种有效的数据管理技术,能够将大型表划分为多个更小、更易管理的分区,从而提升数据库的性能和可...

MySQL基础篇:DQL数据查询操作_mysql 查

一、基础查询DQL基础查询语法SELECT字段列表FROM表名列表WHERE条件列表GROUPBY分组字段列表HAVING分组后条件列表ORDERBY排序字段列表LIMIT...

MySql:索引的基本使用_mysql索引的使用和原理

一、索引基础概念1.什么是索引?索引是数据库表的特殊数据结构(通常是B+树),用于...