当前位置:网站首页>【Go事】一眼看穿 Go 的集合和切片
【Go事】一眼看穿 Go 的集合和切片
2022-07-31 10:27:00 【梦想橡皮擦】
️ Go 集合
在 Go 中与集合相关的关键字是 Map,其表示一种无需的键值对集合,Map 可以通过 Key 检索值,这一点和 Python 中的字典特别像。
集合是无序的,并且使用 hash 表实现。
定义集合
使用 map 关键字定义集合,原型如下:
var map_name map[key_type]value_type
参数说明如下:
map_name
:集合变量名;key_type
:键类型;value_type
:值类型。
Go 中的 map 可动态扩展,无需按照数组一样声明长度。
接下来进行一个简单的声明和使用,代码如下:
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
函数,就会报错,原因也是未分配内存。
如果希望不使用 map
就可以声明和初始化集合,可以在声明的时候,直接赋值。
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
上述声明默认值是 nil
,其中 len=0
,cap=0
。
使用下述代码可以进行测试。
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)
}
声明一个拥有初始长度或特定容量的切片,使用 make
函数完成。
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)
}
上述代码直接完成切片声明和初始化操作,表示切片使用 []
符号,{1,2,3}
表示初始化数据。
可以在已经声明好的切片中进行元素添加,需要使用内建函数 append
添加元素。
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]
你正在阅读 【梦想橡皮擦】 的博客
阅读完毕,可以点点小手赞一下
发现错误,直接评论区中指正吧
橡皮擦的第 701 篇原创博客
从订购之日起,案例5年内保证更新
边栏推荐
- 《JUC并发编程 - 高级篇》06 - 共享模型之不可变(不可变类的设计 | 不可变类的使用 | 享元模式)
- 学习笔记——七周成为数据分析师《第二周:业务》:业务分析框架
- LeetCode二叉树系列——101.对称二叉树
- 小程序如何使用订阅消息(PHP代码+小程序js代码)
- 双链表的插入和删除
- 湖仓一体电商项目(二):项目使用技术及版本和基础环境准备
- Deletion of the sequence table
- nodeJs--querystring模块
- Day113. Shangyitong: user authentication, Alibaba Cloud OSS, patient management
- [ 动词词组 ] 合集
猜你喜欢
随机推荐
Module eight
Web系统常见安全漏洞介绍及解决方案-sql注入
【LeetCode】387. 字符串中的第一个唯一字符
学习笔记——七周成为数据分析师《第二周:业务》:业务分析框架
Data Middle Office Construction (6): Data System Construction
Windows安装mysql详细步骤(通俗易懂,简单上手)
FCN中制作自己的数据集并进行训练
Build finished with errors/Executable Not Found
How SQL intercepts specified characters from strings (three functions of LEFT, MID, RIGHT)
【LeetCode】118.杨辉三角
Open Kylin openKylin automation developer platform officially released
cocoaPods管理之后工程结构变化
AtCoder—E - Σ[k=0..10^100]floor(X/10^k
Detailed explanation of SQL stored procedures
“chmod 777-R 文件名”什么意思?
【云原生监控系列第一篇】一文详解Prometheus普罗米修斯监控系统(山前前后各有风景,有风无风都很自由)
LeetCode二叉树系列——101.对称二叉树
MySQL中JOIN的用法
【LeetCode】73.矩阵置零
感情危机,朋友的网恋女友要和他闹分手,问我怎么办