GO语言-03数组和切片

简介: 自己学习Go语言学习过程中的记录与总结,希望对你能有帮助。第三篇:学习Go语言的数组和切片的语法和常见使用
初心是记录和总结,自己学习Go语言的历程。如果能帮助到你,这是我的荣幸。

数组

当我们需要存很多相同类型变量时,我们并不用定义多个变量,只需要一个容器变量来帮我们存储,这个容器就是数组。

记住!数组是定长!数组是定长!在Go语言我们一定要指定长度,或者用 [...],记牢这个,因为等会还有个切片。

语法:
var 数组名 [指定数组长度]存放的类型 = [指定数组长度]存放的类型{值1,值2...}

例子:

// 定义一个数组(定长),并给予初始化
var array [2]int = [2]int{1,2}
fmt.Println(array) //[1 2]

如果不初始化的话,像这样直接定义var array [2]int,则会输出[0 0],这表示将定义好的数组类型自动初始化(在没有赋值的情况下)

记忆碎片:这种初始化的方法其实和Java类似也是将值放在 { }中。而定义的形式都是遵从 变量定义的形式: var 名字 类型,唯一值得注意的就是需要在 { }再声明一下类型,这里我编译的时候会提示方法的字眼,可能是执行时告知这 并不是一个方法

简易语法:
数组名 := [指定数组长度]存放的类型{值1,值2...}

例子:

// 当然我们可以使用简易定义的方式 :=
array1 := []int{3,4}
fmt.Println(array1) //[3 4]

获取数组的长度:

length := len(array1) //2

获取数组的容量:

length := cap(array1) //2,因为数组是定长啊!
记忆碎片: 使用 :=方便之处是不用写var定义,而且类型是自动推导的

特殊用法:跳跃式指定值

array2 := [3]int{0:0,2:2}
fmt.Println(array2) //[0,0,2]

它的含义是:{对应的下标元素:赋什么值},这里将 下标0 和 下标2 的元素分别赋值为0和2,而下标为1取默认值0

使用 range 循环数组

代码示例:

for index,value := range array3{
        fmt.Println(index,value)
        // 0 0
        // 1 0
        // 2 2
}

使用for搭配range有点Java的加强for循环的味道。index表示是数组的下标,value表示的是数组该下标对应的值。

正常for循环就是使用 len(数组名)获取长度,然后遍历下标通过 数组名[i]一一取值,不再赘述,可以自己尝试。

不想写指定长度,因为可能给我的数字太多了

甲:我这给你一堆相同的值,你给我放到数组中

乙:我数一数...1,2,3.....101...

当然拒绝!搬上[...]的用法(肯定有人说,Java都可以直接那啥用[ ]空着...嗯,我也想这样说,但谁让这是Go的语法呢~)

array4 := [...]int{1,2,3}

就是那么简单,[...]用上了,我们可以不同再写数组的长度,就是避免万一值太多了数不过来呢。

切片 -- 可变长的数组

啊!到切片了,这名字怪怪的,就知道它是个可变长的数组就行咯。

语法:

slice := []int{} //[]

这声明了一个空的切片,输出的是[]

追加元素

slice := []int{}
slice = append(slice,1)

append的用法:append(切片名,追加元素,...),可同时追加多个元素

注意:切片之所以可以动态的追加,是因为append会判断有没有超过切片的容量,没有话会直接添加内容,如果超出容量会 成倍扩增容量

这个成倍是啥意思呢?就拿上面代码为例子,slice = append(slice,1)slice的容量为1,当再增加一个内容的时候超过了切片的容量,这个时候,就会把切片的容量*2倍,如果*2倍还放不下的话,就会将容量扩容到 >= 真实值的一个容量,为什么是 >= 呢?这个留到以后我们分析源码的时候再填坑。现在猜测是一种取整的方式。

总之!这个切片可以通过append无限添新值(内存无限的情况)

取切片的片段

想到这个切片啊,学过Python的同学也会狂喜,啊没错,它还真有[:]的这种用法,但是这种用法取出来的是切片的片段,并不是它的值哦!

切片名 [索引开始:索引结束]

默认索引是从0开始,最后元素的索引是:长度-1

其中索引开始是包含,索引结束是不包含,简单记忆就是,左闭右开原则。通过几个例子简单了解一下吧。

slice := []int{}
slice = append(slice,1,2,3,4,5,6,7,8)

fmt.Println(slice[:]) //[1 2 3 4 5 6 7 8]
fmt.Println(slice[1:]) //[2 3 4 5 6 7 8]
fmt.Println(slice[len(slice)-1:]) //[8]
fmt.Println(slice[0:1]) //[1]
fmt.Println(slice[0]) //1 这个是取出值啊
目录
相关文章
|
1天前
|
存储 编译器 Go
Go语言学习12-数据的使用
【5月更文挑战第5天】本篇 Huazie 向大家介绍 Go 语言数据的使用,包含赋值语句、常量与变量、可比性与有序性
28 6
Go语言学习12-数据的使用
|
2天前
|
Java Go
一文带你速通go语言指针
Go语言指针入门指南:简述指针用于提升效率,通过地址操作变量。文章作者sharkChili是Java/CSDN专家,维护Java Guide项目。文中介绍指针声明、取值,展示如何通过指针修改变量值及在函数中的应用。通过实例解析如何使用指针优化函数,以实现对原变量的直接修改。作者还邀请读者加入交流群深入探讨,并鼓励关注其公众号“写代码的SharkChili”。
9 0
|
2天前
|
存储 缓存 Java
来聊聊go语言的hashMap
本文介绍了Go语言中的`map`与Java的不同设计思想。作者`sharkChili`是一名Java和Go开发者,同时也是CSDN博客专家及JavaGuide项目的维护者。文章探讨了Go语言`map`的数据结构,包括`count`、`buckets指针`和`bmap`,解释了键值对的存储方式,如何利用内存对齐优化空间使用,并展示了`map`的初始化、插入键值对以及查找数据的源码过程。此外,作者还分享了如何通过汇编查看`map`操作,并鼓励读者深入研究Go的哈希冲突解决和源码。最后,作者提供了一个交流群,供读者讨论相关话题。
12 0
|
3天前
|
Java Go
Go语言学习11-数据初始化
【5月更文挑战第3天】本篇带大家通过内建函数 new 和 make 了解Go语言的数据初始化过程
17 1
Go语言学习11-数据初始化
|
4天前
|
自然语言处理 安全 Java
速通Go语言编译过程
Go语言编译过程详解:从词法分析(生成token)到句法分析(构建语法树),再到语义分析(类型检查、推断、匹配及函数内联)、生成中间码(SSA)和汇编码。最后,通过链接生成可执行文件。作者sharkchili,CSDN Java博客专家,分享技术细节,邀请读者加入交流群。
22 2
|
4天前
|
Java Linux Go
一文带你速通Go语言基础语法
本文是关于Go语言的入门介绍,作者因其简洁高效的特性对Go语言情有独钟。文章首先概述了Go语言的优势,包括快速上手、并发编程简单、设计简洁且功能强大,以及丰富的标准库。接着,文章通过示例展示了如何编写和运行Go代码,包括声明包、导入包和输出语句。此外,还介绍了Go的语法基础,如变量类型(数字、字符串、布尔和复数)、变量赋值、类型转换和默认值。文章还涉及条件分支(if和switch)和循环结构(for)。最后,简要提到了Go函数的定义和多返回值特性,以及一些常见的Go命令。作者计划在后续文章中进一步探讨Go语言的其他方面。
10 0
|
5天前
|
JavaScript 前端开发 Go
Go语言的入门学习
【4月更文挑战第7天】Go语言,通常称为Golang,是由Google设计并开发的一种编程语言,它于2009年公开发布。Go的设计团队主要包括Robert Griesemer、Rob Pike和Ken Thompson,这三位都是计算机科学和软件工程领域的杰出人物。
13 1
|
5天前
|
Go
|
6天前
|
分布式计算 Java Go
Golang深入浅出之-Go语言中的分布式计算框架Apache Beam
【5月更文挑战第6天】Apache Beam是一个统一的编程模型,适用于批处理和流处理,主要支持Java和Python,但也提供实验性的Go SDK。Go SDK的基本概念包括`PTransform`、`PCollection`和`Pipeline`。在使用中,需注意类型转换、窗口和触发器配置、资源管理和错误处理。尽管Go SDK文档有限,生态系统尚不成熟,且性能可能不高,但它仍为分布式计算提供了可移植的解决方案。通过理解和掌握Beam模型,开发者能编写高效的数据处理程序。
134 1
|
6天前
|
算法 关系型数据库 MySQL
Go语言中的分布式ID生成器设计与实现
【5月更文挑战第6天】本文探讨了Go语言在分布式系统中生成全局唯一ID的策略,包括Twitter的Snowflake算法、UUID和MySQL自增ID。Snowflake算法通过时间戳、节点ID和序列号生成ID,Go实现中需处理时间回拨问题。UUID保证全局唯一,但长度较长。MySQL自增ID依赖数据库,可能造成性能瓶颈。选择策略时需考虑业务需求和并发、时间同步等挑战,以确保系统稳定可靠。
113 0