【Go事】一眼看穿 Go 的集合和切片

网友投稿 249 2022-08-22


【Go事】一眼看穿 Go 的集合和切片

@[toc]

⛳️ Go 集合

在 Go 中与集合相关的关键字是 Map,其表示一种无需的键值对集合,Map 可以通过 Key 检索值,这一点和 Python 中的字典特别像。

集合是无序的,并且使用 hash 表实现。

定义集合

使用 map 关键字定义集合,原型如下:

var map_name map[key_type]value_type

参数说明如下:

map_name:集合变量名; key_type:键类型; value_type:值类型。

package main import ( "fmt" ) func main() { // 创建集合 var map_var map[string]string // 在使用 map 前,需要先 make,其作用是给 map 分配数据空间 map_var = make(map[string]string) map_var["red"] = "红色" map_var["green"] = "绿色" map_var["blue"] = "蓝色" for color := range map_var { fmt.Println(color, "中文:", map_var[color]) } }

要注意如果创建了集合,但是没有使用 make 函数,就会报错,原因也是未分配内存。

package main import ( "fmt" ) func main() { // 创建集合 map_var := map[string]string{ "red": "红色", "green": "绿色", "blue": "蓝色", } for color := range map_var { fmt.Println(color, "中文:", map_var[color]) } }

Map 元素删除

直接使用内置的 delete 方法即可。

package main import ( "fmt" ) func main() { // 创建集合 map_var := map[string]string{ "red": "红色", "green": "绿色", "blue": "蓝色", } // 删除一个元素 delete(map_var, "red") for color := range map_var { fmt.Println(color, "中文:", map_var[color]) } }

Go 切片

在 Python 中提及切片就是只的取列表的子集,但是在 Go 中是对数组的抽象,在 Go 中切片是一种类型,也叫作动态数组,可以追加扩容元素。

一个切片结构体由三部分构成,Pointer 指向数组的指针,len 切片的长度,cap 切片容量,容量大于等于长度。

var identifier []type

使用下述代码可以进行测试。

package main import "fmt" func main() { var slice_var []int sliceFormat(slice_var) if slice_var == nil { fmt.Printf("空切片") } } func sliceFormat(x []int) { fmt.Printf("len=%d cap=%d slice=%v\n", len(x), cap(x), x) }

var slice_var []type = make([]type, length, capacity)

其中第一个参数是类型,第二个是切片的长度,在这种情况下,切片的容量也是 5,可以测试下述代码。

capacity 可以缺省,即下述代码:

package main import "fmt" func main() { num_slice := make([]int, 5) printSlice(num_slice) } func printSlice(x []int) { fmt.Printf("len=%d cap=%d slice=%v\n", len(x), cap(x), x) }

运行代码,得到下述输出:

len=5 cap=5 slice=[0 0 0 0 0]

可以测试切换不同类型,例如 bool,切片被系统自动初始化为 false。

len=5 cap=5 slice=[false false false false false]

package main import "fmt" func main() { slice_var := []int{1, 2, 3} printSlice(slice_var) } func printSlice(x []int) { fmt.Printf("len=%d cap=%d slice=%v\n", len(x), cap(x), x) }

package main import "fmt" func main() { num_slice := make([]int, 5, 10) num_slice = append(num_slice, 6) printSlice(num_slice) } func printSlice(x []int) { fmt.Printf("len=%d cap=%d slice=%v\n", len(x), cap(x), x) }

多次验证之后,会发现当长度大于 2 时,切片的容量会自动扩容为原来的 2 倍。

# 当 len =10 ,cap =10 时,输出结果 len=10 cap=10 slice=[0 0 0 0 0 6 7 8 9 10] # 扩容之后的结果 len=11 cap=20 slice=[0 0 0 0 0 6 7 8 9 10 11]


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:springboot中pom.xml文件注入test测试依赖时报错的解决
下一篇:Anaconda介绍及安装(anaconda安装教程简书)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~