map

   Go语言中的map是一种无序的,基于key-value的数据解构,在Go语言中map是引用类型,因此必须初始化后才能使用。

   以下示例将展示如何声明一个map类型,以及如何简单使用。

   需要注意的是mapcap可以进行自动扩容,但是我们应该在初始化map的时候就给好适当的容量以提高性能。

package main

import (
"fmt"
) func main() {
// 初始化一个map,key为string类型,value为int类型,容量为10组
var m = make(map[string]int,10)
// 进行填充数据
m["first"] = 110
m["second"] = 120
m["last"] = 119
// 取出value
fmt.Println(m["first"]) // 110
}

声明填充

   在声明map时我们就可以对其填充一些数据,这在很多编程语言中都是被允许的,Go语言中也不例外。

package main

import (
"fmt"
) func main() {
// 注意,不可指定cap
var userInfo = map[string]string{
"userName":"云崖先生",
"userAge":"18",
"userGender":"male",
}
fmt.Println(userInfo)
// map[userAge:18 userGender:male userName:云崖先生]
}

判断key

   Go语言中有个判断map中键是否存在的特殊写法,格式如下:

value, ok := map[key]

   示例如下:

package main

import (
"fmt"
) func main() {
// 注意,不可指定cap
var userInfo = map[string]string{
"userName":"云崖先生",
"userAge":"18",
"userGender":"male",
}
value,ok := userInfo["userHobby"]
if ok{
fmt.Println(value)
}else{
fmt.Println("没有该key")
} fmt.Printf("%v \n",value) // 一堆空格
fmt.Printf("%v \n",ok) // false }

遍历map

   遍历map时应该使用range进行遍历,另外由于map中的数据是无序的,所以遍历的时候也是无序的。

package main

import (
"fmt"
) func main() {
// 注意,不可指定cap
var userInfo = map[string]string{
"userName":"云崖先生",
"userAge":"18",
"userGender":"male",
}
for key,value := range userInfo{
fmt.Printf("%v-%v \n",key,value)
}
}

   当只想遍历key时,可不指定value

顺序遍历

   由于map是无序的,所以如果我们想使用顺序遍历,则需要将key全部提取到一个slice中,遍历slice取出map中的value即可。

package main

import(
"fmt"
"sort"
) func main() {
m := map[string]string{
"k-2": "第二个",
"k-5": "第五个",
"k-1": "第一个",
"k-4": "第四个",
"k-3": "第三个",
}
slice := make([]string,0,5) // 只能用切片,切片才能append
for key := range(m){
slice = append(slice,key)
}
sort.Strings(slice) // 排序
for _,key := range(slice){
fmt.Println(m[key])
}
}

删除元素

   使用内建函数delete()可删除map中的键值对。

delete(map,key)

   示例演示:

package main

import (
"fmt"
) func main() {
// 注意,不可指定cap
var userInfo = map[string]string{
"userName":"云崖先生",
"userAge":"18",
"userGender":"male",
}
delete(userInfo,"userGender")
fmt.Println(userInfo)
// map[userAge:18 userName:云崖先生]
}

切片的元素是map

   切片中的元素可以是map

package main

import (
"fmt"
) func main() {
m := map[string]string{
"k-2": "第二个",
"k-5": "第五个",
"k-1": "第一个",
"k-4": "第四个",
"k-3": "第三个",
}
slice := make([]map[string]string, 0, 1) // 该切片内部只能存储map
slice = append(slice, m)
fmt.Println(slice[0]["k-1"])
fmt.Println(slice[0]["k-2"])
}

map的value是切片

   一个切片也可以作为mapvalue

package main

import (
"fmt"
) func main() {
// 该map的value必须是slice
var sliceMap = make(map[string][]string, 3)
var sliceValue = make([]string, 0, 3)
sliceValue = append(sliceValue,"slice-1","slice-2","slice-3")
sliceMap["first"] = sliceValue
fmt.Println(sliceMap)
// map[first:[slice-1 slice-2 slice-3]]
}

Go map相关的更多相关文章

  1. Java并发包——线程安全的Map相关类

    Java并发包——线程安全的Map相关类 摘要:本文主要学习了Java并发包下线程安全的Map相关的类. 部分内容来自以下博客: https://blog.csdn.net/bill_xiang_/a ...

  2. 作业13:Map相关知识点(一)

    一 Map相关类图 二 Map接口 1 Map接口中的方法 jdk 方法名 简单描述 put(K,V):V 添加value,当Key对应无值,返回null;有值则返回上一个值.(覆盖式,可以反复覆盖前 ...

  3. 测试必备之Java知识(三)—— 集合、Map相关

    集合相关 List.Set.Map的区别 类型 描述 List 允许重复对象,可插入多个null元素,有序 Set 不允许重复对象,只允许一个null元素,无序 Map 不是collection的子接 ...

  4. Map相关知识总结

    Map主要用于存储健值对,根据键得到值,因此不允许键重复(重复了覆盖了),但允许值重复. Hashmap 是一个最常用的Map,它根据键的HashCode 值存储数据,根据键可以直接获取它的值,具有很 ...

  5. Map相关问题

    <!--加载地图开始--> <!DOCTYPE html><html><head> <meta charset="UTF-8" ...

  6. Java中Map相关的快速查找算法与唯一性(转载)

    原文地址:http://blog.csdn.net/chuyuqing/article/details/19629229 在对<Set和hashCode()>的一篇原创文章写完后,由于对自 ...

  7. 双列集合Map相关面试题

    一.了解Map集合吗?Map集合都有哪些实现 HashMap HashTable LinkedHashMap TreeMap ConcurrentHashMap 二.HashMap和HashTable ...

  8. Java面试题集(二)list与Map相关知识(1.2)

    前言: 在平常的写java程序中,常用除了8种常用数据类型,String对象外,还有集合类,例如ArrayList,HashMap等,这些最常用. 一.List接口 List接口为Collection ...

  9. Java——Math,Set,List,map相关练习

    声明一个Set集合,只能保存Double类型的数据, 保存10个随机100以内的数, 找出最大值和最小值,打印输出. public static void main(String[] args) { ...

随机推荐

  1. Java面试题(Java Web篇)

    Java Web 64.jsp 和 servlet 有什么区别? jsp经编译后就变成了Servlet.(JSP的本质就是Servlet,JVM只能识别java的类,不能识别JSP的代码,Web容器将 ...

  2. TCP/IP网络编程之字节序和网络字节序

    一.概要 本篇文章主要讲解基于.net中tcp/ip网络通信编程中的网络字节序.在自我进步的过程中记录这些内容,方便自己记忆的同时也希望可以帮助到大家.技术的进步源自于分享和不断的自我突破. 技术交流 ...

  3. Blazor带我重玩前端(六)

    本文主要讨论Blazor事件内容,由于blazor事件部分很多,所以会分成上下两篇,本文为第二篇. 双向绑定 概述 如图所示 当点击单项绑定的时候,MyOnewayComponent里的属性值会发生变 ...

  4. systemctl 如何启动、关闭、启用/禁用服务

    启动服务:systemctl start xxx.service 关闭服务:systemctl stop xxx.service 重启服务:systemctl restart xxx.service ...

  5. python小白入门基础(四:浮点型和布尔型)

    # Number (int float bool complex)# (1) float 浮点型 也就是小数# 表达方式一floatvar = 0.98print(floatvar)print(typ ...

  6. Math Problem(数学)

    链接:https://ac.nowcoder.com/acm/contest/893/C来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言65536K ...

  7. html打印后不刷新当前页

    这种方法可以在打印的页面中添加样式,新页面跳转打印 doPrint(ids){ var titleHTML=document.getElementById(ids).innerHTML; var Op ...

  8. vue中饼状图的使用

    图形构建子组件 <template> <div> <div id="myChart" :style="echartStyle"&g ...

  9. Docker 容器编排利器 Docker Compose

    Compose 简介 通过前面几篇文章的学习,我们可以通过 Dockerfile 文件让用户很方便的定义一个单独的应用容器.然而,在日常工作中,经常会碰到需要多个容器相互配合来完成某项任务的情况,例如 ...

  10. C016:字符串倒置

    代码: #include "stdafx.h" #include <string.h> int _tmain(int argc, _TCHAR* argv[]) { c ...