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(十一)的更多相关文章

  1. 【翻译】go语言中的map实战

    业余时间翻译,水平很差,如有瑕疵,纯属无能. 原文链接 http://blog.golang.org/go-maps-in-action go语言中的map实战 1. 简介 哈希表是计算机科学中最重要 ...

  2. Go语言中的map

    map是一个集合,可以使用类似处理数组和切片的方式迭代map中的元素.但map是无序的集合.无序的原因是map的实现使用了散列表. map的创建并初始化主要是两种方式: 1.内置的make函数 2.使 ...

  3. 详细解读go语言中的map

    Map map底层是由哈希表实现的 Go使用链地址法来解决键冲突. map本质上是一个指针,指向hmap 这里的buckets就是桶,bmap 每一个bucket最多可以放8个键值对,但是为了让内存排 ...

  4. Java 语言中 Enum 类型的使用介绍

    Enum 类型的介绍 枚举类型(Enumerated Type) 很早就出现在编程语言中,它被用来将一组类似的值包含到一种类型当中.而这种枚举类型的名称则会被定义成独一无二的类型描述符,在这一点上和常 ...

  5. [转]理解Go语言中的nil

    最近在油管上面看了一个视频:Understanding nil,挺有意思,这篇文章就对视频做一个归纳总结,代码示例都是来自于视频. nil是什么 相信写过Golang的程序员对下面一段代码是非常非常熟 ...

  6. [转]Go语言中的make和new

    前言 本文主要给大家介绍了Go语言中函数new与make的使用和区别,关于Go语言中new和make是内建的两个函数,主要用来创建分配类型内存.在我们定义生成变量的时候,可能会觉得有点迷惑,其实他们的 ...

  7. Go语言中new和make的区别

    Go语言中new跟make是内置函数,主要用来创建分配类型内存. new( ) new(T)创建一个没有任何数据的类型为T的实例,并返回该实例的指针: 源码解析 func new func new(T ...

  8. C语言中,头文件和源文件的关系(转)

    简单的说其实要理解C文件与头文件(即.h)有什么不同之处,首先需要弄明白编译器的工作过程,一般说来编译器会做以下几个过程: 1.预处理阶段 2.词法与语法分析阶段 3.编译阶段,首先编译成纯汇编语句, ...

  9. C 语言中 setjmp 和 longjmp

    在 C 语言中,我们不能使用 goto 语句来跳转到另一个函数中的某个 label 处:但提供了两个函数——setjmp 和 longjmp来完成这种类型的分支跳转.后面我们会看到这两个函数在处理异常 ...

随机推荐

  1. 12.JSTL标签

    JSTL是一个不断完善的开源代码的JSP标签库,在JSP2.0中已将JSTL作为标准支持.使用JSTL可以取代在传统JSP程序中嵌入Java代码的做法,在一定程度上提高了代码的可维护性. JSTL有5 ...

  2. 微信小程序_(组件)flex布局

    小程序建议使用flex布局进行排版 flex是一个盒装弹性布局 flex是一个容器,所有子元素都是他的成员 定义布局:display:flex flex容器的属性: 一.flex-direction: ...

  3. HDU 5794 A Simple Chess ——(Lucas + 容斥)

    网上找了很多人的博客,都看不太懂,还是大力学长的方法好. 要说明的一点是,因为是比较大的数字的组合数再加上mod比较小,因此用Lucas定理求组合数. 代码如下(有注释): #include < ...

  4. Android开源界面库--ResideMenu用法

    网上关于ResideMenu用法的教程很多,但基本上全是从Github上copy下来的,Gitbub上给出的了对应的demo,但是由于我的IDE原因吧,demo一直导入不成功.为此自己又捣鼓了一翻,终 ...

  5. C++入门经典-例8.3-子类显示调用父类构造函数

    1:当父类含有带参数的构造函数时,创建子类的时候会调用它吗?答案是通过显示方式才可以调用. 无论创建子类对象时调用的是那种子类构造函数,都会自动调用父类默认构造函数.若想使用父类带参数的构造函数,则需 ...

  6. 在RestController中获取各种信息的方法

    内容 获取方法 URL中路径的一部分 首先需要在RequestMapping做映射, 之后在方法中可以通过注解使用映射的变量@GetMapping("/{id}")public S ...

  7. TCP层accept系统调用的实现分析

    inet_csk_accept函数实现了tcp协议accept操作,其主要完成的功能是,从已经完成三次握手的队列中取控制块,如果没有已经完成的连接,则需要根据阻塞标记来来区分对待,若非阻塞则直接返回, ...

  8. 爬取百度网盘资源报user is not authorized, hitcode:119

    爬取百度网盘资源报user is not authorized, hitcode:119 一.总结 一句话总结: 可能是百度网盘禁止非客户端环境下载大文件,所以将请求头改为客户端:'User-Agen ...

  9. Laravel 中如何区别 Model 或者是 Builder?

    User::where('id',1)->update([])  和  User::find(1)->update([]) 有异曲同工之效.   额? 当你通过 Laravel 与数据库交 ...

  10. oc 计算 带括号 式子

    下面代码实现可以计算 类似以下的字符窜. @"(1+2*(3+4)+3)/2" 自写一个简单 stack .不知道 OC为什么不提供Stack类. #import <Foun ...