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 这个是取出值啊
目录
相关文章
|
5天前
|
存储 JSON 监控
Viper,一个Go语言配置管理神器!
Viper 是一个功能强大的 Go 语言配置管理库,支持从多种来源读取配置,包括文件、环境变量、远程配置中心等。本文详细介绍了 Viper 的核心特性和使用方法,包括从本地 YAML 文件和 Consul 远程配置中心读取配置的示例。Viper 的多来源配置、动态配置和轻松集成特性使其成为管理复杂应用配置的理想选择。
23 2
|
3天前
|
Go 索引
go语言中的循环语句
【11月更文挑战第4天】
12 2
|
3天前
|
Go C++
go语言中的条件语句
【11月更文挑战第4天】
14 2
|
7天前
|
程序员 Go
go语言中的控制结构
【11月更文挑战第3天】
84 58
|
6天前
|
监控 Go API
Go语言在微服务架构中的应用实践
在微服务架构的浪潮中,Go语言以其简洁、高效和并发处理能力脱颖而出,成为构建微服务的理想选择。本文将探讨Go语言在微服务架构中的应用实践,包括Go语言的特性如何适应微服务架构的需求,以及在实际开发中如何利用Go语言的特性来提高服务的性能和可维护性。我们将通过一个具体的案例分析,展示Go语言在微服务开发中的优势,并讨论在实际应用中可能遇到的挑战和解决方案。
|
3天前
|
Go
go语言中的 跳转语句
【11月更文挑战第4天】
11 4
|
3天前
|
JSON 安全 Go
Go语言中使用JWT鉴权、Token刷新完整示例,拿去直接用!
本文介绍了如何在 Go 语言中使用 Gin 框架实现 JWT 用户认证和安全保护。JWT(JSON Web Token)是一种轻量、高效的认证与授权解决方案,特别适合微服务架构。文章详细讲解了 JWT 的基本概念、结构以及如何在 Gin 中生成、解析和刷新 JWT。通过示例代码,展示了如何在实际项目中应用 JWT,确保用户身份验证和数据安全。完整代码可在 GitHub 仓库中查看。
14 1
|
7天前
|
Go 数据处理 API
Go语言在微服务架构中的应用与优势
本文摘要采用问答形式,以期提供更直接的信息获取方式。 Q1: 为什么选择Go语言进行微服务开发? A1: Go语言的并发模型、简洁的语法和高效的编译速度使其成为微服务架构的理想选择。 Q2: Go语言在微服务架构中有哪些优势? A2: 主要优势包括高性能、高并发处理能力、简洁的代码和强大的标准库。 Q3: 文章将如何展示Go语言在微服务中的应用? A3: 通过对比其他语言和展示Go语言在实际项目中的应用案例,来说明其在微服务架构中的优势。
|
7天前
|
Go 数据处理 调度
探索Go语言的并发模型:Goroutines与Channels的协同工作
在现代编程语言中,Go语言以其独特的并发模型脱颖而出。本文将深入探讨Go语言中的Goroutines和Channels,这两种机制如何协同工作以实现高效的并发处理。我们将通过实际代码示例,展示如何在Go程序中创建和管理Goroutines,以及如何使用Channels进行Goroutines之间的通信。此外,本文还将讨论在使用这些并发工具时可能遇到的常见问题及其解决方案,旨在为Go语言开发者提供一个全面的并发编程指南。
|
5天前
|
Go 调度 开发者
探索Go语言中的并发模式:goroutine与channel
在本文中,我们将深入探讨Go语言中的核心并发特性——goroutine和channel。不同于传统的并发模型,Go语言的并发机制以其简洁性和高效性著称。本文将通过实际代码示例,展示如何利用goroutine实现轻量级的并发执行,以及如何通过channel安全地在goroutine之间传递数据。摘要部分将概述这些概念,并提示读者本文将提供哪些具体的技术洞见。