比较熟悉 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)的更多相关文章

  1. Python3 字典(map)

    ayout: post title: Python3 字典(map) author: "luowentaoaa" catalog: true tags: mathjax: true ...

  2. go中的数据结构字典-map

    1. map的使用 golang中的map是一种数据类型,将键与值绑定到一起,底层是用哈希表实现的,可以快速的通过键找到对应的值. 类型表示:map[keyType][valueType] key一定 ...

  3. go中的数据结构-字典map

    1. map的使用 golang中的map是一种数据类型,将键与值绑定到一起,底层是用哈希表实现的,可以快速的通过键找到对应的值. 类型表示:map[keyType][valueType] key一定 ...

  4. 【dart学习】之字典(Map)的相关方法总结

    一,概述 通常来讲,Map是一个键值对相关的对象,键和值可以是任何类型的对象.每个键只出现一次,而一个值则可以出现多次.映射是动态集合. 换句话说,Maps可以在运行时增长和缩小. dart:core ...

  5. 『GoLang』字典Map

    map是一种元素对的无序集合,一组称为元素value,另一组为唯一键索引key. 未初始化map的值为nil.map 是引用类型,可以使用如下声明: var map1 map[keytype]valu ...

  6. 【Redis 系列】redis 学习十六,redis 字典(map) 及其核心编码结构

    redis 是使用 C 语言编写的,但是 C 语言是没有字典这个数据结构的,因此 C 语言自己使用结构体来自定义一个字典结构 typedef struct redisDb src\server.h 中 ...

  7. java 字典 map 和 list.forEach

    1.keySet  key 集 2.values value 集(为何不叫valueSet)... 3.entrySet key value 集 List<?> 循环 1.Iterable ...

  8. map字典,储存cookie,切换账户,展示购物车不同商品

    1:首页 1,静态html5+css做好基本样式 html5,css,jQery, sass 2,jsonp的方式src引入模拟的json数据//这里用的jsonp方式拿数据,详情有使用ajax 遍历 ...

  9. 【spring set注入 注入集合】 使用set注入的方式注入List集合和Map集合/将一个bean注入另一个Bean

    Dao层代码: package com.it.dao; public interface SayHell { public void sayHello(); } Dao的Impl实现层: packag ...

随机推荐

  1. Linux服务器---配置nfs

    配置nfs NFS服务的主要配置文件为/etc/exports./etc/exports文件内容格式: <输出目录> 客户端(选项:访问权限,用户映射,其他) 1.输出目录 输出目录是指N ...

  2. 35 个最好用的 Vue 开源库

    35 个最好用的 Vue 开源库 Vue.js 是一个非常易用的渐进式 JavaScript 框架,用于构建用户界面. 1.Vue Dark Mode Vue.js 的一个极简主义的深色设计系统.它提 ...

  3. render函数

    vue2.0之render函数   虽然vue推荐用template来创建你的html,但是在某些时候你也会用到render函数. 虚拟DOM Vue 通过建立一个虚拟 DOM 对真实 DOM 发生的 ...

  4. 数据库中的undo日志、redo日志

    MySQL中有六种日志文件,分别是:重做日志(redo log).回滚日志(undo log).二进制日志(binlog).错误日志(errorlog).慢查询日志(slow query log).一 ...

  5. 关于reduce输出write方法

    关于hadoop一些自定义输出 code>OutputFormat</code> describes the output-specification for a * Map-Red ...

  6. 第一个django项目-通过命令行和pycharm两种方式

    以本机环境为例,ip地址为172.20.16.148,windows平台,虚拟环境路径为d:\VirtualEnv,项目存放位置为d:\DjangoProject 命令行方式 1.进入虚拟环境创建项目 ...

  7. VMware无法读取USB文件

    今天碰到虚拟机内的Mac OS无法读取USB,经过一番查看,是Windows的服务里面的vmware usb arbitration service服务没有启动,再点击启动的时候,报错,提示本地文件找 ...

  8. Java基础语法(下)

    1.数组动态初始化 //数据类型[] 数组名 = new 数据类型[数组长度]; int[] arr = new int[3]; /* * 左边: * int:说明数组中的元素类型是int类型 * [ ...

  9. Auth组件,Forms组件

    一.Auth组件默认auth_user表常用操作 #1.配置settings,使django与数据库连接 DATABASES = { 'default': { 'ENGINE': 'django.db ...

  10. C# 文件与二进制之间的转换

    /// <summary> /// 工具类:文件与二进制流间的转换 /// </summary> public class FileBinaryConvertHelper { ...