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
    

相关文章
|
6月前
|
存储 JSON 安全
Go语言切片,使用技巧与避坑指南
Go语言中的切片(Slice)是动态引用数组的高效数据结构,支持扩容与截取。本文从切片基础、常用操作到高级技巧全面解析,涵盖创建方式、`append`扩容机制、共享陷阱及安全复制等内容。通过代码示例详解切片特性,如预分配优化性能、区分`nil`与空切片、处理多维切片等。掌握这些核心知识点,可编写更高效的Go代码。
233 2
|
2月前
|
存储 安全 Java
【Golang】(4)Go里面的指针如何?函数与方法怎么不一样?带你了解Go不同于其他高级语言的语法
结构体可以存储一组不同类型的数据,是一种符合类型。Go抛弃了类与继承,同时也抛弃了构造方法,刻意弱化了面向对象的功能,Go并非是一个传统OOP的语言,但是Go依旧有着OOP的影子,通过结构体和方法也可以模拟出一个类。
228 1
|
3月前
|
存储 Java Go
对比Java学习Go——函数、集合和OOP
Go语言的函数支持声明与调用,具备多返回值、命名返回值等特性,结合`func`关键字与类型后置语法,使函数定义简洁直观。函数可作为一等公民传递、赋值或作为参数,支持匿名函数与闭包。Go通过组合与接口实现面向对象编程,结构体定义数据,方法定义行为,接口实现多态,体现了Go语言的简洁与高效设计。
|
5月前
|
数据采集 机器学习/深度学习 存储
Go语言实战案例 - 找出切片中的最大值与最小值
本案例通过实现查找整数切片中的最大值与最小值,帮助初学者掌握遍历、比较和错误处理技巧,内容涵盖算法基础、应用场景及完整代码示例,适合初学者提升编程能力。
|
6月前
|
Go 索引
Go语言中使用切片需要注意什么?
本文详细讲解了Go语言中切片(Slice)的使用方法与注意事项。切片是对数组连续片段的引用,具有灵活的操作方式。文章从定义与初始化、长度与容量、自动扩容、共享底层数组、复制、边界检查、零值到拼接等方面展开,并配以示例代码演示。通过学习,读者可深入了解切片的工作原理及优化技巧,避免常见陷阱,提升编程效率与代码质量。
183 2
|
6月前
|
人工智能 Dart Go
Go语言中的make和new函数的区别及使用场景
本文详细解析了Go语言中`make`和`new`函数的使用方法及区别。`make`用于创建切片、映射和通道等引用类型,返回初始化后的值;`new`用于创建任意类型的零值对象,返回指向该对象的指针。文章通过多个示例说明两者的应用场景,并总结了面试中可能遇到的相关问题,如底层实现、使用场景及优缺点等,帮助读者更好地理解和区分这两个函数。
229 1
|
7月前
|
Go 调度
GO语言函数的内部运行机制分析
以上就是Go语言中函数的内部运行机制的概述,展示了函数在Go语言编程中如何发挥作用,以及Go如何使用简洁高效的设计,使得代码更简单,更有逻辑性,更易于理解和维护。尽管这些内容深入了一些底层的概念,但我希望通过这种方式,将这些理论知识更生动、更形象地带给你,让你在理解的同时找到编程的乐趣。
170 5
|
4月前
|
Cloud Native 安全 Java
Go:为云原生而生的高效语言
Go:为云原生而生的高效语言
314 1
|
4月前
|
Cloud Native Go API
Go:为云原生而生的高效语言
Go:为云原生而生的高效语言
409 0
|
4月前
|
Cloud Native Java Go
Go:为云原生而生的高效语言
Go:为云原生而生的高效语言
272 0

热门文章

最新文章