上一篇
Golang中的Map和Slice的操作技巧
- 行业动态
- 2024-01-17
- 1
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
的形式定义,其中keyType
和valueType
分别表示键和值的类型,我们可以定义一个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是一种引用类型而不是值类型
本站发布或转载的文章及图片均来自网络,其原创性以及文中表达的观点和判断不代表本站,有问题联系侵删!
本文链接:http://www.xixizhuji.com/fuzhu/213974.html