Go数组、多维数组和切片(动态数组),及常用函数len(),cap(),copy(),append()在切片中的使用

简介: 本文介绍了Go语言中数组、多维数组和切片(动态数组)的基本概念和操作,包括数组的定义、初始化、访问,多维数组的定义和访问,以及切片的创建、使用和扩容。同时,还讲解了切片中常用的函数len()、cap()、copy()和append()的使用方法。

Go数组、多维数组和切片(动态数组)

1.数组(一维数组)

数组是具有相同唯一类型的一组已编号且长度固定的数据项序列,数组元素通过索引(下标)来读取,修改数组元素值。

数组定义格式:

var 数组名 [size--数组长度] 数据类型

数组初始化

  1. 先声明,再进行初始化

    // var 数组名 [size] 数据类型 
    var arr3 [3]int
    // 根据索引下标进行赋值
    arr3[0] = 1024
    arr3[1] = 512
    arr3[2] = 256
    
  2. 数组长度确定,在声明定义时进行初始化

    var arr = [size] arr_type {
         ele1,ele2...,elen} 
    // 使用 :=
    arr := [size] arr_type {
         ele1,ele2...,elen}
    

    例如,声明并且初始化 arr1 和 arr2 两个数组

    var arr1 = [10]int{
         1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
    // 或者下面的格式,使用:=来进行快速初始化
    arr2 := [10]int{
         1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
    // 使用 range 进行 for遍历
    for _, v := range arr1 {
         
        fmt.Print(v, "\t") 
        // 1       2       3       4       5       6       7       8       9       10
    }re
    println()
    for _, v := range arr2 {
         
        fmt.Print(v,"\t")
        // 1       2       3       4       5       6       7       8       9       10
    }
    
  3. 数组长度不确定,在声明定义时初始化

    Go为我们提供了...的方式来对长度不确定的数组,进行初始化,其编译器会自行推断数组的长度。

    格式如下

    var arr = [...] 数据类型 {
         元素1,元素2,...,元素n}
    

    例如:

    var arr4 = [...]string{
         
        "张三",
        "李四",
        "王五",
    }
    println(len(arr4)) // ... 为 3
    // 注意,数组中的每个元素需要以逗号分隔,
    // 字符串数组中最后一个元素后也需要加分号
    

数组元素访问:

通过索引下标来访问数组元素:

var arrTest = [4] int {
   1,7,8,3}
element1 = arrTest[0] // 1
element1 = arrTest[3] // 3

2.多维数组

  1. 多维数组定义格式:

    var arrD [size][size] arr_type
    

    注意数组的数据类型必须是统一的且唯一的。

  2. 多维数组的初始化:

    多维数组的声明及初始化与一维数组是完全一样的,以二维数组举例

    var arrD = [size][size] arr_type{
         ele1,ele2...,elen}
    // 或者
    arrD := [size][size] arr_type{
         ele1,ele2...,elen}
    

    在二维数组中不能使用...来进行数组长度不确定。

  3. 多维数组的元素访问:

    与一维数组是完全一样的

    var arrDT = [3][3] int {
         {
         1,3,9},{
         2,4,6},{
         5,7,8}}
    ele1 := arrDT [2] [0] // 5
    ele2 := arrDT [1] [2] // 6
    ele3 := arrDT [0] [1] // 3
    

3.切片(动态数组)

Go 语言切片是对数组的抽象。

Go 数组的长度不可改变,在特定场景中这样的集合就不太适用,Go 中提供了一种灵活,功能强悍的内置类型切片(“动态数组”),与数组相比切片的长度是不固定的,可以追加元素,在追加时可能使切片的容量增大。

  1. 切片的定义格式

    切片不需要声明长度,所以可以使用未定义数组长度来声明一个切片

    var 切片名 []type
    

    经常使用make()函数来定义声明一个切片,如下:

    // make 函数的格式
    var slice1 []type = make([]type, len)
    // 也可以简写为
    slice1 := make([]type, len)
    

    make 函数的格式:

    make([]type, len ,[capacity]) 
    // type 为切片的数据类型
    // len 为切片的初始化长度
    // capacity 为切片的最大容量,capacity为可选参数
    

    若capacity 不写,则默认与len保持一致。

  2. 切片的使用

    go语言提供的切片与python中的切片使用方式基本一致(切片为左闭右开,即包含左边不包含右边)

    切片格式如下:

    var arr = [size] arr_type {
         ele1,ele2,ele3...elen}
    // 对上面的数组进行切片 起始索引 结束索引,切片为左闭右开的格式
    var slice = arr [startIndex : endIndex] 
    // startIndex 为空,则从开始切到endIndex
    // endIndex 为空,则从startIndex 切到 末尾
    // startIndex endIndex 都为空则从开头切到末尾
    

    使用例子如下(tip:可以使用%v进行对切片的值显示):

    // 先创建一个数组,方便一会儿切片来进行测试
    var arr1 = [6]string{
         "java", "python", "go", "rust", "c++", "php"}
    // 1. 从开头切到尾部,相当于一层拷贝,而且可以进行动态扩容
    slice1 := arr1[:]
    println("slice1", slice1) // slice1 [6/6]0xc000057f10
    // 2. 指定起始位置,默认位置不指示
    slice2 := arr1[1:4]
    println("slice2", slice2) // slice1 [3/5]0xc000057f20
    // 3. 指定终止位置,起始位置不指定
    slice3 := arr1[:3]
    println("slice3", slice3) //slice3 [3/6]0xc000057f10
    // 4. 指定区间
    slice4 := arr1[1:3]
    println("slice4", slice4) // slice4 [2/5]0xc000057f20
    // 切片遍历显示,这里只拿slice4来进行演示
    for item := range slice4 {
         
        println(slice4[item]) // python go 可见切片是左开右闭的
    }
    
  3. len() 和 cap() 及 append ()和 copy()函数

    切片是可索引的,并且可以由 len() 方法获取长度。

    切片提供了计算容量的方法 cap() 可以测量切片最长可以达到多少。

    append() 函数可以对切片进行末尾追加,即动态扩容

    copy() 函数 拷贝切片。

    切片的扩容,每次是以两倍的方式进行的。

    // 创建数组
    var arr2 = [3]int{
         123, 456, 789}
    // 进行切片
    sliceN := arr2[:]
    println(len(sliceN))
    println(cap(sliceN))
    // 验证其是否为动态数组,使用append追加
    sliceN = append(sliceN, 333)
    println(len(sliceN)) // 4
    println(cap(sliceN)) // 6
    // 使用make函数创建切片
    sliceN2 := make([]int, 3, 6)
    println(len(sliceN2)) // 3
    println(cap(sliceN2)) // 6
    // copy 拷贝切片
    sliceN3 := make([]int, 3, 12)
    copy(sliceN3, sliceN)
    fmt.Printf("%v,%d,%d", sliceN3, len(sliceN3), cap(sliceN3))
    // [123 456 789],3,12
    

相关文章
|
10天前
|
弹性计算 人工智能 架构师
阿里云携手Altair共拓云上工业仿真新机遇
2024年9月12日,「2024 Altair 技术大会杭州站」成功召开,阿里云弹性计算产品运营与生态负责人何川,与Altair中国技术总监赵阳在会上联合发布了最新的“云上CAE一体机”。
阿里云携手Altair共拓云上工业仿真新机遇
|
6天前
|
机器学习/深度学习 算法 大数据
【BetterBench博士】2024 “华为杯”第二十一届中国研究生数学建模竞赛 选题分析
2024“华为杯”数学建模竞赛,对ABCDEF每个题进行详细的分析,涵盖风电场功率优化、WLAN网络吞吐量、磁性元件损耗建模、地理环境问题、高速公路应急车道启用和X射线脉冲星建模等多领域问题,解析了问题类型、专业和技能的需要。
2506 14
【BetterBench博士】2024 “华为杯”第二十一届中国研究生数学建模竞赛 选题分析
|
6天前
|
机器学习/深度学习 算法 数据可视化
【BetterBench博士】2024年中国研究生数学建模竞赛 C题:数据驱动下磁性元件的磁芯损耗建模 问题分析、数学模型、python 代码
2024年中国研究生数学建模竞赛C题聚焦磁性元件磁芯损耗建模。题目背景介绍了电能变换技术的发展与应用,强调磁性元件在功率变换器中的重要性。磁芯损耗受多种因素影响,现有模型难以精确预测。题目要求通过数据分析建立高精度磁芯损耗模型。具体任务包括励磁波形分类、修正斯坦麦茨方程、分析影响因素、构建预测模型及优化设计条件。涉及数据预处理、特征提取、机器学习及优化算法等技术。适合电气、材料、计算机等多个专业学生参与。
1519 14
【BetterBench博士】2024年中国研究生数学建模竞赛 C题:数据驱动下磁性元件的磁芯损耗建模 问题分析、数学模型、python 代码
|
8天前
|
编解码 JSON 自然语言处理
通义千问重磅开源Qwen2.5,性能超越Llama
击败Meta,阿里Qwen2.5再登全球开源大模型王座
530 13
|
1月前
|
运维 Cloud Native Devops
一线实战:运维人少,我们从 0 到 1 实践 DevOps 和云原生
上海经证科技有限公司为有效推进软件项目管理和开发工作,选择了阿里云云效作为 DevOps 解决方案。通过云效,实现了从 0 开始,到现在近百个微服务、数百条流水线与应用交付的全面覆盖,有效支撑了敏捷开发流程。
19282 30
|
1月前
|
人工智能 自然语言处理 搜索推荐
阿里云Elasticsearch AI搜索实践
本文介绍了阿里云 Elasticsearch 在AI 搜索方面的技术实践与探索。
18836 20
|
1月前
|
Rust Apache 对象存储
Apache Paimon V0.9最新进展
Apache Paimon V0.9 版本即将发布,此版本带来了多项新特性并解决了关键挑战。Paimon自2022年从Flink社区诞生以来迅速成长,已成为Apache顶级项目,并广泛应用于阿里集团内外的多家企业。
17524 13
Apache Paimon V0.9最新进展
|
8天前
|
人工智能 自动驾驶 机器人
吴泳铭:AI最大的想象力不在手机屏幕,而是改变物理世界
过去22个月,AI发展速度超过任何历史时期,但我们依然还处于AGI变革的早期。生成式AI最大的想象力,绝不是在手机屏幕上做一两个新的超级app,而是接管数字世界,改变物理世界。
457 48
吴泳铭:AI最大的想象力不在手机屏幕,而是改变物理世界
|
1天前
|
云安全 存储 运维
叮咚!您有一份六大必做安全操作清单,请查收
云安全态势管理(CSPM)开启免费试用
353 4
叮咚!您有一份六大必做安全操作清单,请查收
|
2天前
|
存储 关系型数据库 分布式数据库
GraphRAG:基于PolarDB+通义千问+LangChain的知识图谱+大模型最佳实践
本文介绍了如何使用PolarDB、通义千问和LangChain搭建GraphRAG系统,结合知识图谱和向量检索提升问答质量。通过实例展示了单独使用向量检索和图检索的局限性,并通过图+向量联合搜索增强了问答准确性。PolarDB支持AGE图引擎和pgvector插件,实现图数据和向量数据的统一存储与检索,提升了RAG系统的性能和效果。