Go 字典(Map)
比较熟悉 Python 的对于字典肯定不会陌生,在 Go 中 map 就是 Python 中字典的概念,它的基本格式是
map[keyType]valueType 。map 的读取和设置和 slice 比较相似,只不过 map 中是通过 key 操作,而 slice
是通过 index 操作,index 只能是 int 类型,map 的 key 可以是 int 、string等类型。
字典的赋值方式
1.先声明再初始化最后赋值
package main import "fmt" func main() {
// 先声明一个字典,key类型为string value类型为string
var m1 map[string]string // 只声明不赋值的map,零值为nil,此时不能给map赋值
if m1 == nil {
// 使用 make 函数对map初始化
m1 = make(map[string]string)
} if m1 != nil {
// 输出 map[]
fmt.Println(m1)
// 赋值操作
m1["name"] = "xiaoming"
fmt.Println(m1)
}
}
输出结果
[root@VM_81_181_centos golang]# go run map01.go
map[]
map[name:xiaoming]
2.使用 make 初始化之后再赋值
package main import "fmt" func main() {
// 使用 make 直接初始化
m1 := make(map[string]int)
m1["age"] = 23
fmt.Println(m1)
}
输出结果
[root@VM_81_181_centos golang]# go run map02.go
map[age:23]
3.直接初始化赋值
package main import "fmt" func main() {
m1 := map[string]string{
"name":"xiaoming",
"hobby":"football",
}
fmt.Println(m1)
}
输出结果
[root@VM_81_181_centos golang]# go run map03.go
map[name:xiaoming hobby:football]
字典的遍历
字典遍历提供了两种方式,一种是需要携带 value,另一种是只需要 key,需要使用 range 关键字
package main import "fmt" func main() {
fruits := map[string]int{
"apple":2,
"banana":5,
"orange":8,
} // 需要携带 value
for name,score := range fruits{
fmt.Println(name, score)
}
// 只需要key
for name := range fruits{
fmt.Println(name)
} }
输出结果
[root@VM_81_181_centos golang]# go run map04.go
apple 2
banana 5
orange 8
#########
apple
banana
orange
在 Go 中没有提供类似 keys() 和 values() 这样的方法,如果我们想获取 key 和 value 的列表需要自己循环
package main import "fmt" func main() {
fruits := map[string]int{
"apple":2,
"banana":5,
"orange":8,
} names := make([]string,0,len(fruits))
scores := make([]int,0,len(fruits)) for name,score := range fruits{
names = append(names,name)
scores = append(scores,score)
} fmt.Println(names,scores)
}
输出结果
[root@VM_81_181_centos golang]# go run map05.go
[apple banana orange] [2 5 8]
字典的读写
package main import "fmt" func main() {
fruits := map[string]int {
"apple": 2,
"banana": 5,
"orange": 8,
} // 读
fmt.Println(fruits["apple"]) // 增加或修改
fruits["pear"] = 9
fmt.Println(fruits) // 删除
delete(fruits, "pear") fmt.Println(fruits)
}
输出结果
[root@VM_81_181_centos golang]# go run map08.go
2
map[banana:5 orange:8 pear:9 apple:2]
map[apple:2 banana:5 orange:8]
字典的多态返回值
在上面的实例中已经可以知道通过 val1 = map1[key1] 的方法获取 key1 对应的值 val1。如果 map 中不存在 key1,
val1 就是一个值类型的空值。那么,此时就会出现一个问题 key1 是不存在还是 key1 对应的值就是空值?
下面介绍一种方式判断 map 中 key 是否存在: val1 , isPresent = map1[key1] ,isPresent 返回一个 bool 值:如果
key1 存在,val1 就是 key1 对应的 value 值,并且 isPresent 为 true;如果 key1 不存在,val1 就是一个空值,并且 isPresent
返回 false。
如果只是想判断某个 key 是否存在而不关心它对应的值到底是多少,可以这样做:
_,ok = map1[key1]// 如果 key1 存在,ok == true 否在 ok == false
或者和 if 混合使用
if _,ok := map1[key1];ok {
//....
}
从 map1 中删除 key1,直接 delete(map1,key1),如果 key1 不存在,该操作也不会报错
package main import "fmt" func main() {
map1 := make(map[string]int) map1["New Delhi"] = 55
map1["Beijing"] = 20
map1["Washington"] = 25 value,isPresent := map1["Beijing"]
if isPresent {
fmt.Printf("The value of \"Beijin\" in map1 is: %d\n", value)
} else {
fmt.Printf("map1 does not contain Beijing")
} // 删除元素
delete(map1,"Washington")
value,isPresent = map1["Washington"]
if isPresent {
fmt.Printf("The value of \"Washington\" in map1 is: %d\n", value)
} else {
fmt.Println("map1 does not contain Washington")
}
}
输出结果
[root@VM_81_181_centos golang]# go run map09.go
The value of "Beijin" in map1 is: 20
map1 does not contain Washington
[root@VM_81_181_centos golang]#
字典的排序
字典默认是无序的,如果想要为 map 排序,需要将 key (或者value) 拷贝至一个切片中,再对切片排序,然后可以使用
切片的 for-range 方法打印所有的 key 和 value
package main import (
"fmt"
"sort"
) func main() {
barVal := map[string]int{
"alpha": 34,
"bravo": 56,
"charlie": 23,
"delta": 87,
"echo": 56,
"foxtrot": 12,
"golf": 34,
"hotel": 16,
"indio": 87,
"juliet": 65,
"kili": 43,
"lima": 98,
}
fmt.Println("unsorted:")
for key,value := range barVal{
fmt.Printf("Key: %v, Value: %v / ", key, value)
} // 创建切片
keys := make([]string,len(barVal))
i := 0
for k,_ := range barVal{
keys[i] = k
i++
} sort.Strings(keys) fmt.Println("sorted")
for _,k := range keys{
fmt.Printf("Key: %v, Value: %v / ", k, barVal[k])
}
}
输出结果
unsorted:
Key: kili, Value: 43 / Key: alpha, Value: 34 / Key: foxtrot, Value: 12 / Key: hotel, Value: 16 / Key: echo, Value: 56 / Key: golf, Value: 34 / Key: indio, Value: 87 / Key: juliet, Value: 65 / Key: lima,
Value: 98 / Key: bravo, Value: 56 / Key: charlie, Value: 23 / Key: delta, Value: 87 / sorted
Key: alpha, Value: 34 / Key: bravo, Value: 56 / Key: charlie, Value: 23 / Key: delta, Value: 87 / Key: echo, Value: 56 / Key: foxtrot, Value: 12 / Key: golf, Value: 34 / Key: hotel, Value: 16 / Key: indi
o, Value: 87 / Key: juliet, Value: 65 / Key: kili, Value: 43 / Key: lima, Value: 98 /
字典的键值对调
这里的键值对调是指调换 key 和 value ,首先能想到的方法就是构造另一个以原 map 的 key 作为 value,以原 map
的 value 作为 key 的 map,然后使用 for-range 遍历原 map 并导入新 map
package main import "fmt" func main() {
originMap := map[string]int{
"a":0,
"b":0,
"c":2,
} fmt.Println(originMap) newMap := make(map[int]string) for key,value := range originMap{
newMap[value] = key
} fmt.Println(newMap)
}
输出结果
map[a:0 b:0 c:2]
map[2:c 0:b]
看输出结果,会发现上面的代码有一个大问题,如果原 map 的 value 不唯一,就会导致新 map 无法完全包含原 map 的
键值对,对于这个问题我们可以使用多值 map的方法解决:map[int][]string,用切片作为 map 的值
package main import "fmt" func main() {
originMap := map[string]int{
"a":0,
"b":0,
"c":2,
} fmt.Println(originMap) newMap := make(map[int][]string) for key,value := range originMap{
newMap[value] = append(newMap[value],key)
} fmt.Println(newMap)
}
输出结果
map[b:0 c:2 a:0]
map[0:[a b] 2:[c]]
Go 字典(Map)的更多相关文章
- Python3 字典(map)
ayout: post title: Python3 字典(map) author: "luowentaoaa" catalog: true tags: mathjax: true ...
- go中的数据结构字典-map
1. map的使用 golang中的map是一种数据类型,将键与值绑定到一起,底层是用哈希表实现的,可以快速的通过键找到对应的值. 类型表示:map[keyType][valueType] key一定 ...
- go中的数据结构-字典map
1. map的使用 golang中的map是一种数据类型,将键与值绑定到一起,底层是用哈希表实现的,可以快速的通过键找到对应的值. 类型表示:map[keyType][valueType] key一定 ...
- 【dart学习】之字典(Map)的相关方法总结
一,概述 通常来讲,Map是一个键值对相关的对象,键和值可以是任何类型的对象.每个键只出现一次,而一个值则可以出现多次.映射是动态集合. 换句话说,Maps可以在运行时增长和缩小. dart:core ...
- 『GoLang』字典Map
map是一种元素对的无序集合,一组称为元素value,另一组为唯一键索引key. 未初始化map的值为nil.map 是引用类型,可以使用如下声明: var map1 map[keytype]valu ...
- 【Redis 系列】redis 学习十六,redis 字典(map) 及其核心编码结构
redis 是使用 C 语言编写的,但是 C 语言是没有字典这个数据结构的,因此 C 语言自己使用结构体来自定义一个字典结构 typedef struct redisDb src\server.h 中 ...
- java 字典 map 和 list.forEach
1.keySet key 集 2.values value 集(为何不叫valueSet)... 3.entrySet key value 集 List<?> 循环 1.Iterable ...
- map字典,储存cookie,切换账户,展示购物车不同商品
1:首页 1,静态html5+css做好基本样式 html5,css,jQery, sass 2,jsonp的方式src引入模拟的json数据//这里用的jsonp方式拿数据,详情有使用ajax 遍历 ...
- 【spring set注入 注入集合】 使用set注入的方式注入List集合和Map集合/将一个bean注入另一个Bean
Dao层代码: package com.it.dao; public interface SayHell { public void sayHello(); } Dao的Impl实现层: packag ...
随机推荐
- python相关工具
1.matlab与python之间的数据传递 import scipy.io as sio import numpy as np ###下面是讲解python怎么读取.mat文件以及怎么处理得到的 ...
- AWS免费云服务套餐申请步骤及常见问题
AWS免费云服务套餐申请步骤及常见问题 AWS免费使用套餐常见问题_AWS免费云服务套餐_-AWS云服务https://amazonaws-china.com/cn/free/faqs/ 什么是 AW ...
- python里面的xlrd模块
♦python操作excel主要用到xlrd和xlwt这两个库,即xlrd是读excel,xlwt是写excel的库. 今天就先来说一下xlrd模块: 一.安装xlrd模块 ♦ 到python官网下载 ...
- 【js】关于闭包和匿名函数
关于js闭包.之前我一直以为是匿名函数,以为封闭式的创建即执行销毁就是闭包,其实这是匿名函数,不一样的.也没有闭包的使用经验. 后来去网上查了下才知道,闭包的意思是:函数内部还有函数,返回一个函数,内 ...
- 获取微信access_token
/** * 获取微信access_token * @return mixed */function get_access_token() { $appId = C('APPID'); $secret ...
- PXC备份方式总结
记录一下. 1.mysqldump数据导出 关于GTID: GTID是MySQL5.6以后,加入了全局事务 ID (GTID) 来强化数据库的主备一致性,故障恢复,以及容错能力. A global t ...
- Linux的常用路由配置
1.配置默认路由 ip route add default via 192.168.10.1 dev eth0 route add default gw 192.168.10.1 2.间接路由: ip ...
- python使用super()调用父类的方法
如果要在子类中引用父类的方法,但是又需要添加一些子类所特有的内容,可通过类名.方法()和super()来调用父类的方法,再个性化子类的对应函数. 直接使用类名.方法()来调用时,还是需要传入self为 ...
- Maven工程打成一个jar包
1:maven-shade-plugin 插件 <plugin> <groupId>org.apache.maven.plugins</groupId> <a ...
- JavaScript之BOM对象
JavaScript bom对象 BOM对象 window对象 所有浏览器都支持 window 对象.概念上讲.一个html文档对应一个window对象.功能上讲: 控制浏览器窗口的.使用上讲: wi ...