Golang中的Map和Slice的操作技巧

Golang中的Map和Slice是两种常用的数据结构。Map是一种键值对映射的数据结构,而Slice是一个动态数组。在Go中使用map[key]value的方式定义,其中key可以是任何支持==和!=操作符的类型,value可以是任意类型的值。而Slice则是通过make函数创建的,它是一个动态数组,可以通过索引访问其中的元素。

Golang中的Map

1、1 Map简介

Map是Golang中一种特殊的数据结构,它是一个键值对的集合,在Golang中,Map使用map[keyType]valueType的形式定义,其中keyTypevalueType分别表示键和值的类型,我们可以定义一个String到int类型的Map:

Golang中的Map和Slice的操作技巧

m := make(map[string]int)

1、2 Map的创建

我们可以使用以下几种方式创建Map:

使用make函数创建空Map:

m := make(map[string]int)

直接指定键值对初始化Map:

m := map[string]int{"apple": 1, "banana": 2}

使用字面量初始化Map:

m := map[string]int{"apple": 1, "banana": 2, "orange": 3}

1、3 Map的常用操作

Golang中的Map和Slice的操作技巧

添加键值对:

m["apple"] = 100

获取键对应的值:

value := m["apple"]

删除键值对:

delete(m, "apple")

判断键是否存在:

value, ok := m["apple"]
if ok {
    fmt.Println("存在")
} else {
    fmt.Println("不存在")
}

遍历Map:

for key, value := range m {
    fmt.Println("key:", key, "value:", value)
}

Golang中的Slice

2、1 Slice简介

Golang中的Map和Slice的操作技巧

Slice是Golang中一种特殊的数据结构,它是一个有序的、动态大小的数据集合,在Golang中,Slice使用[]interface{}或者[]T的形式定义,]interface{}表示任意类型的切片,[]T表示固定类型的切片,我们可以定义一个Int类型的Slice:

slice := []int{1, 2, 3}

2、2 Slice的创建与初始化

我们可以使用以下几种方式创建Slice:

使用make函数创建空Slice:


slice := make([]int, 0) // 长度为0的空Slice,底层存储空间为cap(0)*elemSize(0),容量为0,实际存储空间为0字节;如果不指定长度参数,默认长度为0,当元素被添加到slice时,底层会重新分配内存空间,如果需要频繁地添加或删除元素,建议使用make创建slice时指定其容量。slice := make([]int, 5),表示创建一个长度为5的空Slice,由于底层存储空间未分配,因此实际存储空间仍为0字节,当添加第一个元素后,底层存储空间的大小将变为5*elemSize(4),后续添加元素时,底层存储空间会根据当前元素个数自动扩容,如果需要指定初始容量和容量增长因子等参数,可以使用如下形式:slice := make([]int, initialCap, growthFactor),其中initialCap表示初始容量,growthFactor表示容量增长因子。slice := make([]int, 5, 1.5),表示创建一个长度为5的Slice,容量增长因子为1.5,当添加第6个元素时,底层存储空间的大小将变为5*elemSize(4)+1(扩容空间),扩容后的底层存储空间大小为5*elemSize(4)+1,同理,后续添加元素时,底层存储空间会根据当前元素个数自动扩容,如果需要指定初始容量、容量增长因子以及底层存储空间大小等参数,可以使用如下形式:slice := make([]int, initialCap, growthFactor, capacity),其中capacity表示底层存储空间大小。slice := make([]int, 5, 1.5, 64),表示创建一个长度为5的Slice,容量增长因子为1.5,底层存储空间大小为64字节,需要注意的是,当底层存储空间大小不足以容纳新元素时,会触发一次realloc操作进行扩容,如果不需要指定底层存储空间大小等参数,可以使用如下形式:slice := make([]int),表示创建一个长度为0的空Slice,由于底层存储空间未分配,因此实际存储空间仍为0字节,当添加第一个元素后,底层存储空间的大小将变为len(slice)*elemSize(4),后续添加元素时,底层存储空间会根据当前元素个数自动扩容,当添加第n个元素时,底层存储空间的大小将变为len(slice)*elemSize(4)+n*elemSize(4)(扩容空间),扩容后的底层存储空间大小为len(slice)*elemSize(4)+n*elemSize(4),同理,后续添加元素时,底层存储空间会根据当前元素个数自动扩容,如果需要指定初始容量、容量增长因子以及底层存储空间大小等参数,可以使用如下形式:slice := make([]int, initialCap, growthFactor),其中initialCap表示初始容量,growthFactor表示容量增长因子。slice := make([]int, 5, 1.5),表示创建一个长度为5的Slice,容量增长因子为1.5,当添加第6个元素时,底层存储空间的大小将变为5*elemSize(4)+1(扩容空间),扩容后的底层存储空间大小为5*elemSize(4)+1,同理,后续添加元素时,底层存储空间会根据当前元素个数自动扩容,如果需要指定初始容量、容量增长因子以及底层存储空间大小等参数,可以使用如下形式:slice := make([]int, initialCap, growthFactor),其中initialCap表示初始容量,growthFactor表示容量增长因子。slice := make([]int, 5, 1.5),表示创建一个长度为5的Slice,容量增长因子为1.5,当添加第6个元素时,底层存储空间的大小将变为5*elemSize(4)+1(扩容空间),扩容后的底层存储空间大小为5*elemSize(4)+1,同理,后续添加元素时,底层存储空间会根据当前元素个数自动扩容,如果需要指定初始容量、容量增长因子以及底层存储空间大小等参数,可以使用如下形式:slice := make([]int),表示创建一个长度为0的空Slice,由于底层存储空间未分配,因此实际存储空间仍为0字节,当添加第一个元素后,底层存储空间的大小将变为len(slice)*elemSize(4),后续添加元素时,底层存储空间会根据当前元素个数自动扩容,当添加第n个元素时,底层存储空间的大小将变为len(slice)*elemSize(4)+n*elemSize(4)(扩容空间),扩容后的底层存储空间大小为len(slice)*elemSize(4)+n*elemSize(4),同理,后续添加元素时,底层存储空间会根据当前元素个数自动扩容,如果需要指定初始容量、容量增长因子以及底层存储空间大小等参数,可以使用如下形式:slice := make([]*T)(cap(*T)),T表示任意类型。slice := make([]*int)(cap(*int)),表示创建一个长度为cap(*int)的Slice,底层存储类型为int,注意:由于底层类型不确定且动态变化,因此该方法无法保证创建出的Slice具有正确的类型信息,因此建议在创建Slice时指定其类型信息。slice := make([]*float64](len), cap(*float64)),表示创建一个长度为len、容量为cap的Float64类型的Slice,其中len表示Slice的初始长度,需要注意的是:由于Slice是一种引用类型而不是值类型,因此在使用make函数创建Slice时需要注意其返回值是一个指向内部数据的指针而非实际的Slice对象本身,因此在使用完Slice后应及时将其置为nil以释放内存资源:defer slice.Close() 或者 defer func() { slice = nil }(),否则可能导致内存泄漏等问题,另外需要注意的是:由于Slice是一种引用类型而不是值类型

原创文章,作者:酷盾叔,如若转载,请注明出处:https://www.kdun.com/ask/153585.html

本网站发布或转载的文章及图片均来自网络,其原创性以及文中表达的观点和判断不代表本网站。如有问题,请联系客服处理。

(0)
酷盾叔订阅
上一篇 2024-01-17 10:06
下一篇 2024-01-17 10:07

相关推荐

  • 如何在系统中顺利安装 Golang?

    Golang安装步骤包括下载、安装和配置环境变量。访问官方页面下载适合操作系统的安装包;运行安装包并按指示操作完成安装;在Windows系统中添加Golang的bin目录到系统环境变量Path中,Linux或Mac系统中编辑~/.bash_profile或~/.zshrc文件添加相应路径。

    2024-11-15
    06
  • 在JavaScript中,subString和slice方法有何不同?

    在JavaScript中,subString()和slice()方法都用于从字符串中提取子字符串。subString()方法接受两个参数,分别表示子字符串的起始和结束索引;而slice()方法也接受两个参数,但它允许使用负数索引,表示从字符串末尾开始计算。

    2024-09-03
    028
  • 解决Golang无法启动的故障排查指南

    如果Golang打不开,可以尝试以下方法解决:,,1. 检查Golang环境是否安装正确,可以通过在命令行输入go version查看。,2. 确保Golang的可执行文件路径已添加到系统的环境变量中。,3. 重启计算机后再次尝试打开Golang。,,如果以上方法仍无法解决问题,建议查阅官方文档或寻求社区支持。

    2024-08-26
    0195
  • 如何利用Golang进行高效的MapReduce编程?

    摘要:MapReduce是一种编程模型,用于处理和生成大数据集。在Go语言环境中实现MapReduce可以充分利用其并发特性,提高数据处理效率。通过将任务分解为多个独立的映射和归约作业,Golang版本的MapReduce能够在多核处理器上并行执行,从而加快数据处理速度。

    2024-08-11
    065

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

产品购买 QQ咨询 微信咨询 SEO优化
分享本页
返回顶部
云产品限时秒杀。精选云产品高防服务器,20M大带宽限量抢购 >>点击进入