掌握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

相关文章

SpringBoot分段处理List集合多线程批量插入数据方式

《SpringBoot分段处理List集合多线程批量插入数据方式》文章介绍如何处理大数据量List批量插入数据库的优化方案:通过拆分List并分配独立线程处理,结合Spring线程池与异步方法提升效率... 目录项目场景解决方案1.实体类2.Mapper3.spring容器注入线程池bejsan对象4.创建

PHP轻松处理千万行数据的方法详解

《PHP轻松处理千万行数据的方法详解》说到处理大数据集,PHP通常不是第一个想到的语言,但如果你曾经需要处理数百万行数据而不让服务器崩溃或内存耗尽,你就会知道PHP用对了工具有多强大,下面小编就... 目录问题的本质php 中的数据流处理:为什么必不可少生成器:内存高效的迭代方式流量控制:避免系统过载一次性

C#实现千万数据秒级导入的代码

《C#实现千万数据秒级导入的代码》在实际开发中excel导入很常见,现代社会中很容易遇到大数据处理业务,所以本文我就给大家分享一下千万数据秒级导入怎么实现,文中有详细的代码示例供大家参考,需要的朋友可... 目录前言一、数据存储二、处理逻辑优化前代码处理逻辑优化后的代码总结前言在实际开发中excel导入很

SpringBoot+RustFS 实现文件切片极速上传的实例代码

《SpringBoot+RustFS实现文件切片极速上传的实例代码》本文介绍利用SpringBoot和RustFS构建高性能文件切片上传系统,实现大文件秒传、断点续传和分片上传等功能,具有一定的参考... 目录一、为什么选择 RustFS + SpringBoot?二、环境准备与部署2.1 安装 RustF

MyBatis-plus处理存储json数据过程

《MyBatis-plus处理存储json数据过程》文章介绍MyBatis-Plus3.4.21处理对象与集合的差异:对象可用内置Handler配合autoResultMap,集合需自定义处理器继承F... 目录1、如果是对象2、如果需要转换的是List集合总结对象和集合分两种情况处理,目前我用的MP的版本

JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法

《JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法》:本文主要介绍JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法,每种方法结合实例代码给大家介绍的非常... 目录引言:为什么"相等"判断如此重要?方法1:使用some()+includes()(适合小数组)方法2

GSON框架下将百度天气JSON数据转JavaBean

《GSON框架下将百度天气JSON数据转JavaBean》这篇文章主要为大家详细介绍了如何在GSON框架下实现将百度天气JSON数据转JavaBean,文中的示例代码讲解详细,感兴趣的小伙伴可以了解下... 目录前言一、百度天气jsON1、请求参数2、返回参数3、属性映射二、GSON属性映射实战1、类对象映

C# LiteDB处理时间序列数据的高性能解决方案

《C#LiteDB处理时间序列数据的高性能解决方案》LiteDB作为.NET生态下的轻量级嵌入式NoSQL数据库,一直是时间序列处理的优选方案,本文将为大家大家简单介绍一下LiteDB处理时间序列数... 目录为什么选择LiteDB处理时间序列数据第一章:LiteDB时间序列数据模型设计1.1 核心设计原则

GO语言短变量声明的实现示例

《GO语言短变量声明的实现示例》在Go语言中,短变量声明是一种简洁的变量声明方式,使用:=运算符,可以自动推断变量类型,下面就来具体介绍一下如何使用,感兴趣的可以了解一下... 目录基本语法功能特点与var的区别适用场景注意事项基本语法variableName := value功能特点1、自动类型推

GO语言中函数命名返回值的使用

《GO语言中函数命名返回值的使用》在Go语言中,函数可以为其返回值指定名称,这被称为命名返回值或命名返回参数,这种特性可以使代码更清晰,特别是在返回多个值时,感兴趣的可以了解一下... 目录基本语法函数命名返回特点代码示例命名特点基本语法func functionName(parameters) (nam