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来完成这种类型的分支跳转.后面我们会看到这两个函数在处理异常 ...
随机推荐
- Mountain Number FZU-2109数位dp
Mountain NumberFZU-2109 题目大意:一个大于0的数字x,分写成x=a[0]a[1]a[2][3]..a[n]的形式,(比如x=1234,a[0]=1,a[1]=2,a[3]=3, ...
- 数位dp入门 HDU 2089 HDU 3555
最基本的一类数位dp题,题目大意一般是在a~b的范围,满足某些要求的数字有多少个,而这些要求一般都是要包含或者不包含某些数字,或者一些带着数字性质的要求,一般来说暴力是可以解决这一类问题,可是当范围非 ...
- TensorFlow使用记录 (十): Pretraining
上一篇的模型保存和恢复熟练后,我们就可以大量使用 pretrain model 来训练任务了 Tweaking, Dropping, or Replacing the Upper Layers The ...
- 为什么还需要学习TypeScript
开篇 TypeScript 是由 C#语言的创始人 Anders Hejlsberg 设计的一种编程语言,设计的初衷就是为了帮助 JavaScript 的开发人员能像类似高级语言c#,Java那样编写 ...
- Git 推送文件到远程仓库
Configure Git for the first time: git config --global user.name "xxxxx xx"git config --glo ...
- laravel 文件上传总结
调用 store 方法会生成唯一的 ID 来作为文件名,如果想获取原件本来的名称可以使用 $file = $request->file('file'); $file->getClientO ...
- 【React自制全家桶】六、React性能优化(持续更新总结)
一.通过虚拟DOM来提升性能(自动) 底层讲解见[React自制全家桶]二.分析React的虚拟DOM和Diff算法 二.将多次setState合并为一次执行(自动) 底层讲解见[React自制全 ...
- 自定义application的全局捕获异常实现
package com.loaderman.global; import android.app.Application; import android.os.Environment; import ...
- Card 卡片
将信息聚合在卡片容器中展示. 基础用法 包含标题,内容和操作. Card 组件包括header和body部分,header部分需要有显式具名 slot 分发,同时也是可选的. <el-card ...
- js闭包1
闭包是函数和声明该函数的词法环境的组合. function init() { var name = "Mozilla"; // name 是一个被 init 创建的局部变量 fun ...