Go语言中的map(十一)
map是一种无序的基于 key-value 的数据结构,Go语言中的map是引用类型,所以跟切片一样需要初始化才能使用。
定义map
定义 map 的语法如下:
map[keyType]ValueType // keyType 键的类型
// ValueType 键对应的值的类型
定义 map 而不初始化时,默认值等于 nil,此时不能直接赋值的,如:
func main() {
var a map[string]int // 定义了map
fmt.Println(a==nil) // true
a["age"] = // error 未初始化直接赋值,会报错
}
可以使用 make() 来给 map 分配内存,有了容量的 map 是可以操作的,格式如下:
make(map[keyType]valueType,[cap]) // 其中cap表示map的容量,该参数虽然不是必须的,但是我们应该在初始化map的时候就为其指定一个合适的容量。
map 基本使用
使用 make()定义map:
func main() {
myMap := make(map[string]int,)
fmt.Println(myMap) // map[]
fmt.Println(myMap==nil) // false
myMap["小明"] =
fmt.Println(myMap) // map[小明:100]
fmt.Println(myMap["小明"]) //
fmt.Printf("Type:%T",myMap) // Type:map[string]int
}
你也可以直接在定义时填充元素:
func main() {
userInfo:=map[string]string{
"username":"wj",
"address":"中国",
}
fmt.Println(userInfo) // map[address:中国 username:wj]
fmt.Printf("%#v",userInfo) // map[string]string{"address":"中国", "username":"wj"}
// 占位符 "%#v" 输出对应值的Go语法表示
}
判断某个键是否存在
Go语言中有个判断map中键是否存在的特殊写法,格式如下:
value,ok := map[key]
例子:
func main() {
userInfo:=map[string]string{
"username":"wj",
"address":"中国",
}
v,ok := userInfo["username"]
if ok {
fmt.Printf("有username这个key,其值为:%v",v)
}else{
fmt.Println("没有username这个key")
}
}
遍历map
使用 for range 来遍历 map:
func main() {
ageMap:=make(map[string]int,)
ageMap["小明"] =
ageMap["小红"] =
ageMap["小军"] =
for k,v:=range ageMap{
fmt.Println(k,v)
}
}
// 小明 18
// 小红 15
// 小军 16
有时如果只想遍历key,我们可以这样写:
for k:_=range ageMap{
fmt.Println(k)
}
但在遍历map时,如果只想要遍历key,可以省略_,直接这样写:
for k:=range ageMap{
fmt.Println(k)
}
需要注意的是,遍历map时的元素顺序与添加键值对的顺序无关。
使用 delete() 函数删除键值对
使用内建函数 delete() 删除map中的一组键值对,语法格式:
delete(map,key)
例子:
func main() {
ageMap:=make(map[string]int,)
ageMap["小明"] =
ageMap["小红"] =
ageMap["小军"] =
delete(ageMap,"小红") // 将 小红:15 删除
for v,k:=range ageMap{
fmt.Println(v,k)
}
}
// 小明 18
// 小军 16
元素为map类型的切片
func main() {
var mapSlice = make([]map[string]string,) // 定义值类型为map的切片,容量为3
for i,v:=range mapSlice{
fmt.Println(i,v)
}
// mapSlice[0]["username"] = "wj" // error,直接操作切片的map元素会报错
mapSlice[] = make(map[string]string,) // 对切片中的 map元素 进行初始化
mapSlice[]["username"] = "wj"
mapSlice[]["address"] = "中国"
for i,v:=range mapSlice{
fmt.Println(i,v)
}
}
// 0 map[]
// 1 map[]
// 2 map[]
// 0 map[address:中国 username:wj]
// 1 map[]
// 2 map[]
值为切片类型的map
func main() {
var sliceMap = make(map[string][]string,) // 定义值为切片类型的map
fmt.Println(sliceMap)
sliceMap["address"] = []string{"北京","上海"}
fmt.Println(sliceMap)
}
// map[]
// map[address:[北京 上海]]
Go语言中的map(十一)的更多相关文章
- 【翻译】go语言中的map实战
业余时间翻译,水平很差,如有瑕疵,纯属无能. 原文链接 http://blog.golang.org/go-maps-in-action go语言中的map实战 1. 简介 哈希表是计算机科学中最重要 ...
- Go语言中的map
map是一个集合,可以使用类似处理数组和切片的方式迭代map中的元素.但map是无序的集合.无序的原因是map的实现使用了散列表. map的创建并初始化主要是两种方式: 1.内置的make函数 2.使 ...
- 详细解读go语言中的map
Map map底层是由哈希表实现的 Go使用链地址法来解决键冲突. map本质上是一个指针,指向hmap 这里的buckets就是桶,bmap 每一个bucket最多可以放8个键值对,但是为了让内存排 ...
- Java 语言中 Enum 类型的使用介绍
Enum 类型的介绍 枚举类型(Enumerated Type) 很早就出现在编程语言中,它被用来将一组类似的值包含到一种类型当中.而这种枚举类型的名称则会被定义成独一无二的类型描述符,在这一点上和常 ...
- [转]理解Go语言中的nil
最近在油管上面看了一个视频:Understanding nil,挺有意思,这篇文章就对视频做一个归纳总结,代码示例都是来自于视频. nil是什么 相信写过Golang的程序员对下面一段代码是非常非常熟 ...
- [转]Go语言中的make和new
前言 本文主要给大家介绍了Go语言中函数new与make的使用和区别,关于Go语言中new和make是内建的两个函数,主要用来创建分配类型内存.在我们定义生成变量的时候,可能会觉得有点迷惑,其实他们的 ...
- Go语言中new和make的区别
Go语言中new跟make是内置函数,主要用来创建分配类型内存. new( ) new(T)创建一个没有任何数据的类型为T的实例,并返回该实例的指针: 源码解析 func new func new(T ...
- C语言中,头文件和源文件的关系(转)
简单的说其实要理解C文件与头文件(即.h)有什么不同之处,首先需要弄明白编译器的工作过程,一般说来编译器会做以下几个过程: 1.预处理阶段 2.词法与语法分析阶段 3.编译阶段,首先编译成纯汇编语句, ...
- C 语言中 setjmp 和 longjmp
在 C 语言中,我们不能使用 goto 语句来跳转到另一个函数中的某个 label 处:但提供了两个函数——setjmp 和 longjmp来完成这种类型的分支跳转.后面我们会看到这两个函数在处理异常 ...
随机推荐
- 中国剩余定理及其拓展 CRT&EXGCD
中国剩余定理,又叫孙子定理. 作为一个梗广为流传.其实它的学名叫中国单身狗定理. 中国剩余定理 中国剩余定理是来干什么用的呢? 其实就是用来解同余方程组的.那么什么又是同余方程组呢. 顾名思义就是n个 ...
- Linux 打印可变参数日志
实现了传输进去的字符串所在的文档,函数和行数显示功能. 实现了将传入的可变参数打印到日志功能. #include<stdio.h> #include<stdarg.h> #in ...
- linux下源码安装mariadb
1.mariadb源码包下载地址:https://downloads.mariadb.org/ 2.安装mariadb是依赖包,创建mysql用户和目录: 命令 yum -y install rea ...
- centos 7 php7 yum源
rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm rpm -Uvh https://mir ...
- Jmeter(九)参数化
参数化是自动化测试脚本的一种常用技巧.简单来说,参数化的一般用法就是将脚本中的某些输入使用参数来代替,在脚本运行时指定参数的取值范围和规则: 这样,脚本在运行时就可以根据需要选取不同的参数值作为输入. ...
- 如何在main.js中改变vuex中的值?
做登录权限控制的时候, 我通过全局路由守卫来去做权限判断,这样的话可能需要在整个项目加载的初期去做一些诸如 接口请求. vuex修改 之类的问题 其实非常简单,直接如图:
- ai笔记
- under the hood
under the hood adjective a metaphorical area that contains the underlying implementation of somethin ...
- RGB颜色透明度转换
100% — FF95% — F290% — E685% — D980% — CC75% — BF70% — B365% — A660% — 9955% — 8C50% — 8045% — 7340% ...
- 阿里JAVA诊断工具Arthas的初步使用
Arthas 是Alibaba开源的Java诊断工具,主要解决以下问题: 这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception? 我改的代码为什么没有执行到?难道是我没 comm ...