当前位置:首页 > 行业动态 > 正文

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:

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的常用操作

添加键值对:

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简介

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是一种引用类型而不是值类型
0