广告
返回顶部
首页 > 资讯 > 精选 >Go 语言中怎么实现数组与切片
  • 699
分享到

Go 语言中怎么实现数组与切片

2023-06-15 14:06:10 699人浏览 独家记忆
摘要

本篇文章为大家展示了Go 语言中怎么实现数组与切片,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。数组数组是一组类型相同的,长度固定的,按数字编号排列的数据序列。由于 go  语言中,数组的

本篇文章为大家展示了Go 语言中怎么实现数组与切片,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。

数组

数组是一组类型相同的,长度固定的,按数字编号排列的数据序列。由于 go  语言中,数组的类型相同且长度固定,所以在声明数组的时候,就会体现这两个特点。

var array [5]int // [0 0 0 0 0]

数组通过 [SIZE](方括号内为数组长度) 加上 TYPE(类型) 的形式声明,上面的代码就表示 array 变量为一个长度为 5,且五个数据的类型都为  int。

在之前介绍变量的时候,介绍过 int 类型的默认值为 0,所以 array 的值为 [0 0 0 0 0]。

数组初始化

数组在初始化阶段,需要通过 {} 的方式,指定数组每个位置的具体值。

var array [3]int = [3]int{1, 2, 3} // [1 2 3]

可以看到 {} 的前面也要带上数组的长度与类型,由于 go 能够进行类型推导,变量后声明的类型显得有点多余,是可以省略的。

var array = [3]int{1, 2, 3} // [1 2 3]

? 指定索引赋值

初始化的过程中,我们还可以指定索引进行赋值,也就是不必给数组的每个位置都安排上具体的值。

var array = [5]int{1: 77, 3: 77} // [0 77 0 77 0]

上面的数组输出的结果为:[0 77 0 77 0]。和其他语言一样,数组的索引是从 0 开始的,我们给索引为 1 和 3 位置都指定了值为 77  ,其他位置由于没有指定具体值,就是其类型的默认值。

? 自动推导数组长度

前面的案例都是指定了数组的长度,其实我们可以通过 [...] 的方式,告诉 go 编译器,数组长度尚未确定,在初始化之后才能确定其长度,然后 go  在编译阶段就会自动进行推导。

var array = [...]int{1, 2, 3, 4, 5} // [1 2 3 4 5] fmt.Println("array length is", len(array))

我们可以通过 len 方法获取数组的长度,上面代码的运行结果如下:

Go 语言中怎么实现数组与切片

如果我们在指定索引的位置赋值了,最终长度取决于最末尾的索引,下面的代码中,指定了索引 5 的值为 77,则数组的长度为 6。

var array = [...]int{1: 77, 5: 77} // [0 77 0 0 0 77] fmt.Println("array length is", len(array))

Go 语言中怎么实现数组与切片

赋值与访问

与其他语言一样,数组的赋值和访问都是通过 [Index] 操作的。

var array = [...]int{1, 2, 3} array[0] = 100 // 索引 0 的位置重新赋值为 100 fmt.Println("array is", array)

Go 语言中怎么实现数组与切片

取值也是同样的操作,我们现在实现一个求数组平均数的函数:

func getAverage(array [5]int) float32 {  var sum int  var avg float32   for i := 0; i < 5; i++ {   sum += array[i]  }   avg = float32(sum) / 5   return avg }
var array = [5]int{1, 2, 3, 4, 5} fmt.Println("average is", getAverage(array))

Go 语言中怎么实现数组与切片

多维数组

多维数组的声明,相对于一维数组,就是看前面有几个 [SIZE]。

var a1 [2][3]int // 二维数组 var a1 [2][3][4]int // 三维数组

我们拿三维数组举例,第一个 [] 内的数字表示最外层数组的长度,往后以此类推。[2][3][4]int 表示最外层数组长度为 2,第二层数组长度为  3,最内层数组长度为 4。其赋值方式也和一维数组一样,只是多维数组需要将多个 {} 进行嵌套。

var a1 = [2][3][4]int{   {     {1, 2, 3, 4},     {1, 2, 3, 4},     {1, 2, 3, 4},   },   {     {1, 2, 3, 4},     {1, 2, 3, 4},     {1, 2, 3, 4},   }, } fmt.Println(a1)

打印结果:

Go 语言中怎么实现数组与切片

多维数组的访问和一维数组一样,也是通过 [] + 数组索引,只是多维数组要访问某个值需要多个 []。

如果我们要拿到下图的 2,访问方式为:array[0][1][1]

Go 语言中怎么实现数组与切片

fmt.Println("array[0][1][1] = ", array[0][1][1])

Go 语言中怎么实现数组与切片

切片

前面介绍过,数组是一组类型相同且长度固定的数据集合,而切片就是一种比较抽象的数组,其长度不固定,声明方式与数组类似([]  中不显示注明数组长度,也不使用 [...] 的方式进行长度的推导):

var slice []int

切片初始化

切片的初始化与数组类似,只要省略掉 [] 内注明的数组长度即可:

var s1 = []int{1, 2, 3} s2 := []int{1, 2, 3} // 简写

除了这种字面量的声明方式,还可以通过 go 的内置方法:make,来进行切片的初始化:

var s1 = make([]int, 3) s2 := make([]int, 3) // 简写

make 方法的第二个参数表示切片的长度,虽然切片的长度可变,但是通过 make 方法创建切片时,需要指定一个长度。除了指定切片的长度,make  方法还支持传入第三个参数,用来指定切片的『容量』,如果没有指定切片的容量,那初始状态切片的容量与长度一致。

func make([]T, len, cap)

长度与容量

长度指的是,切片内有多少个元素,而容量可以理解为,当前切片在内存中开辟了多大的空间。前面介绍过,可以通过 len  方法获取到数组的长度,获取切片的长度也可以使用该方法。要获取切片的容量,可以使用 cap 方法。

s1 := make([]int, 5) fmt.Printf("The length of s1 is %d\n", len(s1)) fmt.Printf("The capacity of s1 is %d\n", cap(s1))

Go 语言中怎么实现数组与切片

可以看到初始状态下,切片的长度与容量一致。如果要修改切片的长度,可以通过 append方法,在切片尾部追加一个新的值。

s1 := make([]int, 3, 5) // 声明一个长度为 3,容量为 5 的切面 s1 = append(s1, 1) // 在尾部追加一个值,长度会变成 4  fmt.Printf("The length of s1 is %d\n", len(s1)) fmt.Printf("The capacity of s1 is %d\n", cap(s1))

Go 语言中怎么实现数组与切片

append 方法是可以接受多个参数,我们在追加一个值之后,继续调用 append 方法,往切片后再追加两个值:

s1 := make([]int, 3, 5) s1 = append(s1, 1) s1 = append(s1, 2, 3) fmt.Println(s1) // [0 0 0 1 2 3] fmt.Printf("The length of s1 is %d\n", len(s1)) fmt.Printf("The capacity of s1 is %d\n", cap(s1))

此时的切片的长度已经变成了 6,超过了切片的容量,那这个时候切换的容量会不会也变成 6?

Go 语言中怎么实现数组与切片

根据输出的结果,此时切片的容量变成了 10,这意味着切片的容量的扩充是在之前的基础上进行翻倍操作的。为了验证这个结论,我们在切片后继续追加 5  个值,让切片的长度变成 11,超出当前的容量,看看容量会变成多少。

s1 := make([]int, 3, 5) s1 = append(s1, 1) s1 = append(s1, 2, 3) s1 = append(s1, 4, 5, 6, 7, 8)  fmt.Printf("The length of s1 is %d\n", len(s1)) fmt.Printf("The capacity of s1 is %d\n", cap(s1))

Go 语言中怎么实现数组与切片

可以看到切片的容量变成了 20,这也验证了我们之前的结论,当切片长度超过了其容量,容量会在原来的基础上翻倍。那如果切片容量达到了 2000,长度超过  2000,容量也会变成 4000 吗?

s1 := make([]int, 1024) s1 = append(s1, 1)  fmt.Printf("\nThe length of s1 is %d\n", len(s1)) fmt.Printf("The capacity of s1 is %d\n", cap(s1))

Go 语言中怎么实现数组与切片

可以看到,我们新定义的切片长度为 1024,在长度变成 1025 的时候,容量并没有翻倍。为了避免切片容量无休止的扩展,go 规定如果当前切片的长度大于  1024 ,在长度超过其容量时,只会增加 25% 的容量。

切片截取

切片之所以叫切片,是因为它可以通过切出数组中的某一块来创建。语法规则也很简单:Array[start:end]。

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

Go 语言中怎么实现数组与切片

arr[1:3] 表示将数组的从索引为 1 的位置一直到索引为 3 的位置(不包括  3)截取出来,形成一个切片。当然这个开头结尾的数字也是可以省略的,如果我们如果我们省略开头就表示截取开始的位置为  0,省略结尾就表示截取结束的位置一直到数组的最后一位。

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

Go 语言中怎么实现数组与切片

通过省略截取的开头和结尾,我们就能将一个数组进行一次拷贝操作,然后形成一个切片。(PS. 截取操作形成的新数据是一个切片)

arr := [5]int{1, 2, 3, 4, 5} slice := arr[:]  fmt.Printf("slice = %v, slice type is %T", slice, slice)

Go 语言中怎么实现数组与切片

上述内容就是Go 语言中怎么实现数组与切片,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注编程网精选频道。

--结束END--

本文标题: Go 语言中怎么实现数组与切片

本文链接: https://www.lsjlt.com/news/280676.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Go 语言中怎么实现数组与切片
    本篇文章为大家展示了Go 语言中怎么实现数组与切片,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。数组数组是一组类型相同的,长度固定的,按数字编号排列的数据序列。由于 go  语言中,数组的...
    99+
    2023-06-15
  • Go语言中的数组与切片介绍
    这篇文章主要讲解了“Go语言中的数组与切片介绍”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Go语言中的数组与切片介绍”吧!1. 数组数组是一个由固定长度的...
    99+
    2022-10-18
  • go语言中数组与切片有哪些区别
    本文小编为大家详细介绍“go语言中数组与切片有哪些区别”,内容详细,步骤清晰,细节处理妥当,希望这篇“go语言中数组与切片有哪些区别”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。数组与切片的区别:1、切片是指针类...
    99+
    2023-07-05
  • GO语言对数组切片去重的实现
    目录1.go中没有去重方法2.自定义一个适配多个切片类型的去重器补充:通过map键的唯一性去重(推荐)通过map键的唯一性去重Go语言是2007年由Google开发的一种静态强类型的...
    99+
    2022-11-13
  • 详细介绍Go语言之数组与切片
    目录一、数组1、数组的定义2、数组赋值3、定义并初始化4、数组的大小是类型的一部分5、数组是值类型6、数组长度 len() 数组长度在定义阶段已经固定7、数组循环8、多维数组9、数组...
    99+
    2022-11-12
  • GO语言的数组array与切片slice详解
    GO语言数组(array) 在GO语言中,数组是用于存储相同数据类型的集合,数组长度必须是一个常量表达式,且是一个非负数GO语言中的数组是一种值类型,下文会介绍 GO语言数组定义的格...
    99+
    2022-12-19
    GO语言的数组array GO语言切片slice GO语言数组定义赋值 GO语言多维数组 GO语言创建切片 GO语言复制与追加切片
  • go语言二维数组切片怎么定义
    在Go语言中,可以使用make函数来创建二维切片。具体的定义方式如下: slice := make([][]int, numRows...
    99+
    2023-10-21
    go语言
  • Go语言中的数组和切片是什么
    本篇内容介绍了“Go语言中的数组和切片是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!目录 数组 切片(Slice)append 函数1...
    99+
    2023-06-20
  • Go语言中数组,切片和映射怎么使用
    这篇文章主要讲解了“Go语言中数组,切片和映射怎么使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Go语言中数组,切片和映射怎么使用”吧!Arrays (数组), Slices (切片) ...
    99+
    2023-07-02
  • go语言中切片和数组指的是什么
    本文小编为大家详细介绍“go语言中切片和数组指的是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“go语言中切片和数组指的是什么”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。在go语言中,数组是一个由固定长度...
    99+
    2023-07-04
  • Go语言怎么实现切片增删改查
    本篇内容主要讲解“Go语言怎么实现切片增删改查”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Go语言怎么实现切片增删改查”吧!引言Golang 的数组是固定长度,可以容纳相同数据类型的元素的集合...
    99+
    2023-06-30
  • go语言切片怎么生成
    本篇内容介绍了“go语言切片怎么生成”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!在go语言中,切片(slice)是对数组的一个连续片段的引...
    99+
    2023-07-04
  • Go 语言中的数组和切片有什么区别?
    在 Go 语言中,数组和切片都是常见的数据结构。尽管它们都可以用于存储相同类型的数据,但它们在语义上具有不同的行为,这使得它们在实际使用中有着不同的用途。 数组 数组是一种固定长度、存储相同类型元素的集合。在 Go 语言中,数组的长度...
    99+
    2023-10-07
    数组 git 日志
  • Go语言copy()实现切片复制
    Go语言的内置函数 copy() 可以将一个数组切片复制到另一个数组切片中,如果加入的两个数组切片不一样大,就会按照其中较小的那个数组切片的元素个数进行复制。 copy() 函数的使...
    99+
    2023-05-14
    Go 切片复制 Go copy()
  • Go语言中的数组、切片和映射解析
    目录 数组数组的声明数组循环 切片切片声明切片元素循环 映射Map的声明及初始化Map的遍历 数组 数组存放的是固定长度、相同类型的数据,而且这些存放的元素是连续的。 数组的声...
    99+
    2023-09-08
    学习 go 青少年编程 开发语言
  • Go语言append切片添加元素怎么实现
    这篇“Go语言append切片添加元素怎么实现”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Go语言append切片添加元素...
    99+
    2023-07-05
  • Go语言数组和切片的区别详解
    目录数组声明以及初始化函数参数切片声明以及初始化函数参数总结参考文章:在 Go 语言中,数组和切片看起来很像,但其实它们又有很多的不同之处,这篇文章就来说说它们到底有哪些不同。 另外...
    99+
    2023-05-14
    Go 数组和切片
  • go语言中切片与内存复制 memcpy 的实现操作
    Go 语言原则上不支持内存的直接操作访问,但是提供了切片功能。 最初我以为切片就是动态数组,实际程序设计过程中发现,切片是提供数组一个内存片段的一个合法的手段,利用切片功能,实...
    99+
    2022-06-07
    GO memcpy go语言
  • 简单聊一聊Go语言中的数组和切片
    目录1. 数组2. 切片(Slice)append 函数总结1. 数组 数组是一个由固定长度的特定类型元素组成的序列,一个数组可以由零个或多个元素组成。因为数组的长度是固定的,因此...
    99+
    2022-11-12
  • 怎么使用Go语言的copy()实现切片复制
    本文小编为大家详细介绍“怎么使用Go语言的copy()实现切片复制”,内容详细,步骤清晰,细节处理妥当,希望这篇“怎么使用Go语言的copy()实现切片复制”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。Go语言的...
    99+
    2023-07-05
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作