广告
返回顶部
首页 > 资讯 > 后端开发 > GO >GO语言的数组array与切片slice详解
  • 669
分享到

GO语言的数组array与切片slice详解

摘要

Go语言数组(array) 在GO语言中,数组是用于存储相同数据类型的集合,数组长度必须是一个常量表达式,且是一个非负数GO语言中的数组是一种值类型,下文会介绍 GO语言数组定义的格

Go语言数组(array)

在GO语言中,数组是用于存储相同数据类型的集合,数组长度必须是一个常量表达式,且是一个非负数
GO语言中的数组是一种值类型,下文会介绍

GO语言数组定义的格式

var 数组名称 [数组长度]数组类型
例:
var arr [3]int

输出为:

[0 0 0]

在GO语言中,初始化数组时,给定了数组长度,但没给定数组下标的值,int类型默认值为0,string类型默认为空值,这是常用的两种类型

GO语言数组的赋值操作

// 第一种赋值操作
var arr = [3]int{1,2,3} //直接将值初始化,不同的类似初始化值不相同
// 第二种赋值操作
var arr [3]int  // 初始化数组变量
arr[1] = 1      // 给数组的下标赋值
// 第三种赋值操作
var arr  = [3]string{1:"one",2:"two"}
// 一般常用的就这三种,其它方式都是一些变相的操作,这里不做介绍

有必要说明一下:数组在初始中给定了数组的长度,用len(arr)-1可以得到数组的长度,如果赋值时操出数组的最大长度,在编译的时候将会报错

先来个练习加深下前面所说的影响,将一个int型数组的值全部乘以2

package main
import "fmt"
func main(){
    var arrs = [5]int{1, 2, 3, 4, 5}
    for i, v := range arrs {
        arrs[i] = v * 2
        fmt.Printf("index is %d,value is %d \n", i, arrs[i])
    }
}

输出为

index is 0,value is 2 
index is 1,value is 4 
index is 2,value is 6 
index is 3,value is 8 
index is 4,value is 10 

GO语言数组的值类型

在GO语言中,数组的存储是一种值的类型,不像C等其它语言是指向首元素的指针,所以在创建数组也可以通过new() 来创建一个指针数组
例:

var arr1 = new([5]int)
var arr2 [5]int

输出分别为

&[0 0 0 0 0]
[0 0 0 0 0]

&符号熟悉么,没错,他表明这是一个指针数组,在函数中传递时,不用将数组的值进行复制一遍

GO语言多维数组

在某种程度上面来说,多维数组其实就是将多个一维数组进行嵌套一种表达方式,例如:var arr1 [3][5]int输出为[[0 0 0 0 0] [0 0 0 0 0] [0 0 0 0 0]]如果尝过其它语言编程的人一看就明白是怎么回事了

做个小题目:定义一个空的二维数组,将二维数组的值与索引一至

package main
import "fmt"
func main{
var arr_more [5][5]int
    fmt.Println(arr_more)
    for i, x := range arr_more {
        for i1, _ := range x {
            arr_more[i][i1] = i1
        }
    }
    fmt.Println(arr_more)
}

输出

初始化数组:
[[0 0 0 0 0] [0 0 0 0 0] [0 0 0 0 0] [0 0 0 0 0] [0 0 0 0 0]]
值与索引对应
[[0 1 2 3 4] [0 1 2 3 4] [0 1 2 3 4] [0 1 2 3 4] [0 1 2 3 4]]

数组的处理还有很多别的形式,等着你在实际工作中的发现与总结

GO语言切片(slice)

切片是对数组一个连续片段的引用,它是一个引用类型,存储的是指针,所以在性能上比值数组更快,使用方法和数组基本类似,也可以通过索引进行访问,len()获得切片的长度,cap()获得切片最大的长度

GO语言切片声明格式

var 声明变量 []变量类型

和声明数组非常相似,切片的声明是不需要指定数组长度,因为切片的长度是可变的(等会介绍)

一个切片在初始化之前默认为nil,长度为0一个相对完整的例子:

package main
import "fmt"
func main{
    var arr = [5]int{1, 2, 3, 4, 5}
    var slice []int
    fmt.Printf("初始化切片默认 %d\n", slice)
    var slice1 []int = arr[:]
    fmt.Printf("切片复制数组(简写) %d\n", slice1)
    var slice2 []int = arr[0:2]
    fmt.Printf("切片获得数组0-1的下标 %d\n", slice2)
    var slice3 []int = arr[2:5]
    fmt.Printf("切片获得数组2-4的下标 %d\n", slice3)
}

输出

初始化切片默认 []
切片复制数组(简写) [1 2 3 4 5]
切片获得数组0-1的下标 [1 2]
切片获得数组2-4的下标 [3 4 5]

上面的例子介绍了切片的初始化和获得数组中某一个片段的值,当然还有一些其他用法比如[:3],[3:]等等,切片的灵活性非常高,就看你需要什么数组的哪个片段

注意 绝对不要用指针指向 slice。切片本身已经是一个引用类型,所以它本身就是一个指针!!

GO语言用make()创建一个切片

当相关的数组还没有创建好的时候,我们可以用make()函数来创建一个切片,同时创建好相关联的数组

var slice []int = make([]type,len,cap)
var 切片变量 []切片类型 = make([]数组类型,数组长度,最大长度) cap是可选参数

通过一个例子来说明make的使用

package main
import "fmt"
func main() {
    var slice1 []int = make([]int, 5)
    for i := 0; i < len(slice1); i++ {
        slice1[i] = 5 * i
        fmt.Printf("Slice at %d is %d\n", i, slice1[i])
    }
    fmt.Printf("\nThe length of slice1 is %d\n", len(slice1))
    fmt.Printf("The capacity of slice1 is %d\n", cap(slice1))
}

输出

Slice at 0 is 0  
Slice at 1 is 5  
Slice at 2 is 10  
Slice at 3 is 15  
Slice at 4 is 20

The length of slice1 is 5  
The capacity of slice1 is 5  

make()函数在初始化切片是经常被使用的方式,当然你要用简单的var slice[]int = arr[:]也可以,看习惯

GO语言切片的复制与追加

通过copy()append()来进行操作
一个例子:

package main
import "fmt"
func main(){
sl_from := []int{1, 2, 3}
    sl_to := make([]int, 10)

    n1 := copy(sl_to, sl_from)
    fmt.Println(sl_to)
    fmt.Printf("Copied %d elements\n", n1) // n == 3

    sl3 := []int{1, 2, 3}
    sl3 = append(sl3, 4, 5, 6)
    fmt.Println(sl3)
}

输出:

[1 2 3 0 0 0 0 0 0 0]
Copied 3 elements
[1 2 3 4 5 6]

复制与增加需要注意的:

  • 是将后面的元素或切片追加到前面
  • 必须是相同的元素类型
  • 当容量不足时,会生成一个新的地址来保证新增加的元素
  • 如果上面的条件都满足,一般来说都会返回成功,除非内存耗尽了(无解)

小记:

当然切片还有更多的细节及处理方式,完整版最好还是去看官方提供的文档,本篇重点介绍了GO的数组与切片

更多关于GO语言的数组array与切片slice知识请查看下面的相关链接

您可能感兴趣的文档:

--结束END--

本文标题: GO语言的数组array与切片slice详解

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

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

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

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

下载Word文档
猜你喜欢
  • GO语言的数组array与切片slice详解
    GO语言数组(array) 在GO语言中,数组是用于存储相同数据类型的集合,数组长度必须是一个常量表达式,且是一个非负数GO语言中的数组是一种值类型,下文会介绍 GO语言数组定义的格...
    99+
    2022-12-19
    GO语言的数组array GO语言切片slice GO语言数组定义赋值 GO语言多维数组 GO语言创建切片 GO语言复制与追加切片
  • Go语言--切片(Slice)详解
    目录一、定义切片1、声明一个未指定大小的数组来定义切片2、使用make()函数来创建切片二、切片是可索引的1、len() 和 cap() 函数三、切片截取四、增加切片的容量说明: ...
    99+
    2022-11-12
  • go语言中切片Slice与数组Array对比以及panic: runtime error: index out of range问题解决
    目录前言一、go slice是什么二、go slice实战案例1.slice创建、使用2、slice的长度和容量概念理解3. 切片扩容及slice panic: runtime er...
    99+
    2022-11-13
  • 聊聊go语言中的切片(slice)
    本篇文章带大家了解一下golang中可变长度的"数组"——切片(slice),希望对大家有所帮助!golang切片(slice)(1)切片的定义切片(Slice)是一个拥有相同类型元素的可变长度的序列。它是基于数组类型做...
    99+
    2022-07-04
    go语言 golang 切片
  • 详细介绍Go语言之数组与切片
    目录一、数组1、数组的定义2、数组赋值3、定义并初始化4、数组的大小是类型的一部分5、数组是值类型6、数组长度 len() 数组长度在定义阶段已经固定7、数组循环8、多维数组9、数组...
    99+
    2022-11-12
  • Go语言数组和切片的区别详解
    目录数组声明以及初始化函数参数切片声明以及初始化函数参数总结参考文章:在 Go 语言中,数组和切片看起来很像,但其实它们又有很多的不同之处,这篇文章就来说说它们到底有哪些不同。 另外...
    99+
    2023-05-14
    Go 数组和切片
  • Go语言中的数组与切片介绍
    这篇文章主要讲解了“Go语言中的数组与切片介绍”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Go语言中的数组与切片介绍”吧!1. 数组数组是一个由固定长度的...
    99+
    2022-10-18
  • Go语言里切片slice的用法介绍
    1.切片是基于数组做的一层封装,灵活能够自动扩容。 2.切片的初始化方法 ①直接创建 ②基于已有的数组或切片 ③使用make来创建一个切片 第一个5是切片的大小 第二个5是切片...
    99+
    2022-11-13
  • 详解Go语言中数组,切片和映射的使用
    目录1.Arrays (数组)2.切片2.1 make创建切片3.映射MapArrays (数组), Slices (切片) 和 Maps (映射) 是常见的一类数据结构 1.Arr...
    99+
    2022-11-13
  • Go 语言中怎么实现数组与切片
    本篇文章为大家展示了Go 语言中怎么实现数组与切片,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。数组数组是一组类型相同的,长度固定的,按数字编号排列的数据序列。由于 go  语言中,数组的...
    99+
    2023-06-15
  • go语言中数组与切片有哪些区别
    本文小编为大家详细介绍“go语言中数组与切片有哪些区别”,内容详细,步骤清晰,细节处理妥当,希望这篇“go语言中数组与切片有哪些区别”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。数组与切片的区别:1、切片是指针类...
    99+
    2023-07-05
  • Go语言中的数组、切片和映射解析
    目录 数组数组的声明数组循环 切片切片声明切片元素循环 映射Map的声明及初始化Map的遍历 数组 数组存放的是固定长度、相同类型的数据,而且这些存放的元素是连续的。 数组的声...
    99+
    2023-09-08
    学习 go 青少年编程 开发语言
  • C语言 array数组的用法详解
    目录一维数组的创建与初始化程序一:程序二:程序三程序四(二维数组 - 二维数组 的 列 绝对不能 省略 )二维数组在内存中的存储程序一数组作为函数参数,怎么作?实例:冒泡排序数组名:...
    99+
    2022-11-12
  • 详解Go语言中切片的长度与容量的区别
    目录切片的声明切片的长度和容量切片追加元素后长度和容量的变化append 函数切片的源代码学习切片的结构体切片的扩容总结切片的声明 切片可以看成是数组的引用(实际上切片的底层数据结构...
    99+
    2022-11-11
  • GO语言对数组切片去重的实现
    目录1.go中没有去重方法2.自定义一个适配多个切片类型的去重器补充:通过map键的唯一性去重(推荐)通过map键的唯一性去重Go语言是2007年由Google开发的一种静态强类型的...
    99+
    2022-11-13
  • Go语言中的数组和切片是什么
    本篇内容介绍了“Go语言中的数组和切片是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!目录 数组 切片(Slice)append 函数1...
    99+
    2023-06-20
  • 详解Go语言Slice作为函数参数的使用
    目录前言问题与解析典型问题其它疑问1其它疑问2结论参考链接前言 首先要明确Go语言中实质只有值传递,引用传递和指针传递是相对于参数类型来说。 个人认为上诉的结论不对,把引用类型看做...
    99+
    2022-11-12
  • 详解Go语言中的Slice链式操作
    目录示例原理实现示例 首先模拟一个业务场景,有订单、产品、自定义订单三个结构体,订单中包含多个产品: type Order struct { Id string Pr...
    99+
    2023-05-15
    Go Slice链式操作 Go Slice操作 Go Slice
  • Go语言数组和切片的区别有哪些
    这篇“Go语言数组和切片的区别有哪些”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Go语言数组和切片的区别有哪些”文章吧。数...
    99+
    2023-07-05
  • go语言中切片和数组指的是什么
    本文小编为大家详细介绍“go语言中切片和数组指的是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“go语言中切片和数组指的是什么”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。在go语言中,数组是一个由固定长度...
    99+
    2023-07-04
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作