掌握Go语言:深入理解Go语言中的数组和切片,灵活处理数据的利器(16)

本文主要是介绍掌握Go语言:深入理解Go语言中的数组和切片,灵活处理数据的利器(16),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Go语言中的数组和切片是常用的集合类型,它们在处理数据时提供了不同的特性和灵活性。本文将深入探讨数组和切片的使用方法、特性、实例以及应用场景。

1. 数组和切片简介

在Go语言中,数组和切片都是集合类的类型,用于存储相同类型的元素。它们的主要区别在于数组的长度是固定的,而切片的长度是可变的。

1.1 数组

数组的长度在声明时就必须给定,并且在之后不会再改变。数组的长度是其类型的一部分,例如 [1]string[2]string 是两个不同的数组类型。

// 示例1:声明一个长度为5的整型数组
arr := [5]int{1, 2, 3, 4, 5}
1.2 切片

切片是数组的一层简单封装,切片的长度可以随着元素数量的增长而增长,但不会随着元素数量的减少而减少。切片的类型字面量中只有元素的类型,没有长度。

// 示例2:创建一个切片
slice := make([]int, 0, 5) // 初始长度为0,容量为5的整型切片

2. 切片表达式和容量

通过切片表达式,我们可以创建新的切片,指定切片的起始索引和结束索引。切片的容量表示底层数组中可以被切片窗口最右边元素的索引所覆盖的范围。

// 示例3:使用切片表达式创建切片
arr := []int{1, 2, 3, 4, 5, 6, 7, 8}
slice := arr[3:6] // 从索引3到索引6(不包括)创建切片

3. 切片的容量增长规律

切片在容量不足时会进行扩容,一般情况下新容量是原容量的两倍,但当原长度大于或等于1024时,新容量基准为原容量的1.25倍,直至满足新长度。

// 示例4:切片扩容规律演示
package mainimport "fmt"func main() {// 创建一个切片slice := make([]int, 0, 1)// 模拟切片扩容过程for i := 1; i <= 2048; i++ {slice = append(slice, i)fmt.Printf("Length: %d, Capacity: %d\n", len(slice), cap(slice))}
}

4. 切片的底层数组和追加元素

切片的底层数组永远不会被替换,扩容时会生成新的底层数组和新的切片。使用append函数对切片追加元素时,如果新长度不超过原容量,底层数组保持不变。

// 示例5:使用append函数追加元素
slice := []int{1, 2, 3}
slice = append(slice, 4, 5) // 追加元素4和5到切片末尾

5. 应用场景

  • 数组:适合用于表示固定长度的数据集合,如一周的天数 [7]string

    daysOfWeek := [7]string{"Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"}
    
  • 切片:常用于动态增长的数据集合,如日志收集、HTTP请求的处理等。

    logEntries := []string{"entry1", "entry2", "entry3"}
    
  • 切片扩容:当需要动态管理数据集合大小时,切片的自动扩容特性尤为重要,如读取文件内容、处理大量数据等场景。

    data := make([]byte, 0, 1024)
    // 读取文件内容并追加到切片
    for {chunk := readFromFile()if chunk == nil {break}data = append(data, chunk...)
    }
    

6. 进销存示例

package mainimport "fmt"func main() {// 声明一个存储商品名称的数组var products [3]string// 添加商品名称到数组中products[0] = "手机"products[1] = "电脑"products[2] = "平板"// 声明一个切片用于存储每个商品的库存数量var inventory []int// 初始化库存数量inventory = append(inventory, 10) // 手机库存数量inventory = append(inventory, 20) // 电脑库存数量inventory = append(inventory, 15) // 平板库存数量// 显示每个商品的名称和库存数量for i, product := range products {fmt.Printf("商品名称: %s, 库存数量: %d\n", product, inventory[i])}
}

以上代码是一个简单的 Go 语言程序,用于模拟一个简单的进销存系统。让我们逐行解释这段代码:

  1. package main:声明了这个文件属于 main 包,这是 Go 语言程序的入口包。

  2. import "fmt":导入了 fmt 包,这个包实现了格式化输入输出的功能,我们可以使用它来打印输出信息到控制台。

  3. func main() { ... }:定义了程序的主函数,是程序执行的入口点。

  4. var products [3]string:声明了一个长度为 3 的字符串数组,用于存储商品名称。数组的长度是固定的,并且初始化为零值(空字符串)。

  5. products[0] = "手机"products[1] = "电脑"products[2] = "平板":将商品名称分别赋值给数组中的每个元素。

  6. var inventory []int:声明了一个整型切片,用于存储每个商品的库存数量。切片的长度可以动态增长,初始时长度为 0。

  7. inventory = append(inventory, 10)inventory = append(inventory, 20)inventory = append(inventory, 15):使用 append 函数向切片中追加元素,分别表示手机、电脑和平板的库存数量。

  8. for i, product := range products { ... }:使用 range 关键字遍历数组 productsi 表示当前索引,product 表示当前商品名称。在循环中,通过索引 i 可以从切片 inventory 中获取对应商品的库存数量,然后将商品名称和库存数量打印输出到控制台。

这段代码演示了如何使用数组和切片来实现一个简单的进销存系统,通过循环遍历打印出每个商品的名称和对应的库存数量。

7. 总结

  • 数组长度固定,切片长度可变。
  • 切片通过窗口查看底层数组,容量为切片窗口最右边元素的索引。
  • 切片扩容规律:一般为原容量的两倍,但长度大于等于1024时为1.25倍。
  • 切片的底层数组不会被替换,append返回新切片。
  • 数组适用于固定长度的集合,切片适用于动态管理数据集合。

这篇关于掌握Go语言:深入理解Go语言中的数组和切片,灵活处理数据的利器(16)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/818140

相关文章

从基础到高级详解Go语言中错误处理的实践指南

《从基础到高级详解Go语言中错误处理的实践指南》Go语言采用了一种独特而明确的错误处理哲学,与其他主流编程语言形成鲜明对比,本文将为大家详细介绍Go语言中错误处理详细方法,希望对大家有所帮助... 目录1 Go 错误处理哲学与核心机制1.1 错误接口设计1.2 错误与异常的区别2 错误创建与检查2.1 基础

深入理解Mysql OnlineDDL的算法

《深入理解MysqlOnlineDDL的算法》本文主要介绍了讲解MysqlOnlineDDL的算法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小... 目录一、Online DDL 是什么?二、Online DDL 的三种主要算法2.1COPY(复制法)

Linux下利用select实现串口数据读取过程

《Linux下利用select实现串口数据读取过程》文章介绍Linux中使用select、poll或epoll实现串口数据读取,通过I/O多路复用机制在数据到达时触发读取,避免持续轮询,示例代码展示设... 目录示例代码(使用select实现)代码解释总结在 linux 系统里,我们可以借助 select、

JavaScript对象转数组的三种方法实现

《JavaScript对象转数组的三种方法实现》本文介绍了在JavaScript中将对象转换为数组的三种实用方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友... 目录方法1:使用Object.keys()和Array.map()方法2:使用Object.entr

Go语言中json操作的实现

《Go语言中json操作的实现》本文主要介绍了Go语言中的json操作的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录 一、jsOChina编程N 与 Go 类型对应关系️ 二、基本操作:编码与解码 三、结构体标签(Struc

C#使用iText获取PDF的trailer数据的代码示例

《C#使用iText获取PDF的trailer数据的代码示例》开发程序debug的时候,看到了PDF有个trailer数据,挺有意思,于是考虑用代码把它读出来,那么就用到我们常用的iText框架了,所... 目录引言iText 核心概念C# 代码示例步骤 1: 确保已安装 iText步骤 2: C# 代码程

Pandas处理缺失数据的方式汇总

《Pandas处理缺失数据的方式汇总》许多教程中的数据与现实世界中的数据有很大不同,现实世界中的数据很少是干净且同质的,本文我们将讨论处理缺失数据的一些常规注意事项,了解Pandas如何表示缺失数据,... 目录缺失数据约定的权衡Pandas 中的缺失数据None 作为哨兵值NaN:缺失的数值数据Panda

C++中处理文本数据char与string的终极对比指南

《C++中处理文本数据char与string的终极对比指南》在C++编程中char和string是两种用于处理字符数据的类型,但它们在使用方式和功能上有显著的不同,:本文主要介绍C++中处理文本数... 目录1. 基本定义与本质2. 内存管理3. 操作与功能4. 性能特点5. 使用场景6. 相互转换核心区别

python语言中的常用容器(集合)示例详解

《python语言中的常用容器(集合)示例详解》Python集合是一种无序且不重复的数据容器,它可以存储任意类型的对象,包括数字、字符串、元组等,下面:本文主要介绍python语言中常用容器(集合... 目录1.核心内置容器1. 列表2. 元组3. 集合4. 冻结集合5. 字典2.collections模块

Redis高性能Key-Value存储与缓存利器常见解决方案

《Redis高性能Key-Value存储与缓存利器常见解决方案》Redis是高性能内存Key-Value存储系统,支持丰富数据类型与持久化方案(RDB/AOF),本文给大家介绍Redis高性能Key-... 目录Redis:高性能Key-Value存储与缓存利器什么是Redis?为什么选择Redis?Red