【Go语言】【10】GO语言的map

原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://qingkechina.blog.51cto.com/5552198/1620429

    GO语言中的复合类型除了数组、切片之外,还有一个map;说起map估计大家都不陌生,因为在Java、C++等语言中有它的身影,它以<key,value>的形式为程序员提供服务。

从图中也可以看出:内存中存储了六个城市信息,其中key是城市电话区号,value是城市名称。对于城市电话区号(key)是唯一的,这样方便程序员对城市名称(value)进行增、删、改、查等操作;另外<key,value>之间也存在一定的关联,即图中的箭头,但这种关联关系对GO语言的初学者来说并不需要特别关心。

一、map声明、初始化和赋值

1、声明格式:var 变量名 map[key值类型]value值类型

例如:

var cityMap map[string]string

var employeeMap map[int]string

var boolMap map[string]bool

2、map初始化

var cityMap map[string]string = map[string]string{"010": "北京", "022": "天津", "021": "上海", "020": "广州", "0755": "深圳", "0571": "杭州"}

var employeeMap map[int]string = map[int]string{1: "Boss", 2: "manager", 3: "employee"}

var boolMap map[string]bool = map[string]bool{"朝鲜": true, "日本": false, "伊朗": true, "中国": true, "俄罗斯": false}

当然,若嫌这句太长,可以简化如下:

var cityMap = map[string]string{"010": "北京", "022": "天津", "021": "上海", "020": "广州", "0755": "深圳", "0571": "杭州"}

var employeeMap = map[int]string{1: "Boss", 2: "manager", 3: "employee"}

var boolMap = map[string]bool{"朝鲜": true, "日本": false, "伊朗": true, "中国": true, "俄罗斯": false}

还可以这样简化:

cityMap := map[string]string{"010": "北京", "022": "天津", "021": "上海", "020": "广州", "0755": "深圳", "0571": "杭州"}

employeeMap := map[int]string{1: "Boss", 2: "manager", 3: "employee"}

boolMap := map[string]bool{"朝鲜": true, "日本": false, "伊朗": true, "中国": true, "俄罗斯": false}

若上面两种简化方式还是感觉太长,可以采用赋值方式

3、map赋值

var cityMap map[string]string   // 声明cityMap变量

var employeeMap map[int]string  // 声明employeeMap变量

var boolMap map[string]bool    // 声明boolMap变量

cityMap = map[string]string{}   // 初始化变量cityMap

cityMap["010"] = "北京"       // 对变量cityMap进行赋值

cityMap["022"] = "天津"

cityMap["021"] = "上海"

cityMap["020"] = "广州"

cityMap["0755"] = "深圳"

cityMap["0571"] = "杭州"

employeeMap = map[int]string{} // 初始化变量employeeMap

employeeMap[1] = "Boss"      // 对变量employeeMap进行赋值

employeeMap[2] = "manager"

employeeMap[3] = "employee"

boolMap = map[string]bool{}    // 初始化变量boolMap

boolMap["朝鲜"] = true       // 对变量boolMap进行赋值

boolMap["日本"] = false

boolMap["伊朗"] = true

boolMap["中国"] = true

boolMap["俄罗斯"] = false

二、创建和遍历map

1、使用make创建map

除了上面的方式声明map之外,还可以类似slice采用GO语言内置函数make()来创建一个新map。上例可以改写如下:

cityMap := make(map[string]string)

employeeMap := make(map[int]string)

boolMap := make(map[string]bool)

map的创建与slice的创建类似,也可以在创建时指定map的容量

cityMap := make(map[string]string, 6)

employeeMap := make(map[int]string, 3)

boolMap := make(map[string]bool, 5)

2、遍历map

下面通过一个示例来了解如何遍历map:(1)创建map并赋值(2)遍历map(3)删除电话区号为022的城市

// 创建map并赋值

cityMap := make(map[string]string, 6)

cityMap["010"] = "北京"

cityMap["022"] = "天津"

cityMap["021"] = "上海"

cityMap["020"] = "广州"

cityMap["0755"] = "深圳"

cityMap["0571"] = "杭州"

fmt.Println(cityMap)

// 遍历map

for k, _ := range cityMap {

    // 删除电话区号为022的城市

    if k == "022" {

        delete(cityMap, k)

    }

}

fmt.Println(cityMap)

程序运行结果为:

3、多返回值

    GO语言与Java、C++等一个极大不同之处在于:多返回值,GO语言的函数可以有多个返回值,这个特性使得代码编写更简洁

for key, value := range cityMap{

   // 略

}

这里使用遍历cityMap时,就把该map之间的<key,value>值都返回了,程序员即可以使用key值,也可以使用value,假设程序员不需要value值,则可以像上例一样,把value更改为_

for key, _  := range cityMap{

   // 略

}

三、map注意事项

1、map以<key, value>的形式存储数据,其中key必须是支持==或者!=运算的类型,而不能是map、slice或者函数

2、map查找比线性搜索速度快

3、判断map元素个数使用len()函数,而不是size()

4、GO语言使用内置delete()函数删除map中的元素,第一个参数是map,第二个参数是map中的key,若这个key不存在,则什么都不发生,但若key被设置为nil,那么这个删除将会抛出异常

四、map中的value

map中的value类型可以是基础类型,也可以是复合类型,也可以是结构体

1、value类型为结构体

【value类型为结构体的存储模型示意图】:

【程序实现】:

// 定义结构体

type Persion struct {

    Name, Phone string

    Age         int

}

// 创建map,它的value类型为Persion

persionMap := make(map[string]Persion)

// 给map中元素赋值,其key类型为字符串,value类型为Persion

persionMap["123456"] = Persion{Name: "纠正哥", Age: 35, Phone: "13581887557"}

persionMap["789012"] = Persion{Name: "裸跑弟", Age: 5, Phone: "none"}

// 遍历map打印出Persion信息

for _, value := range persionMap {

    fmt.Println("姓名:", value.Name, "\t年龄:", value.Age, "\t电话:", value.Phone)

}

【运行结果】:

2、value类型为map

【程序实现】:

// 创建map,它的value类型为map

persionMap := make(map[string]map[string]string)

persionMap["123456"] = map[string]string{"name": "纠正哥", "phone": "13581887557", "age": "35"}

persionMap["789012"] = map[string]string{"name": "裸跑弟", "phone": "none", "age": "5"}

// 遍历map打印出Persion信息

for _, value := range persionMap {

    fmt.Println("姓名:", value["name"], "\t年龄:", value["age"], "\t电话:", value["phone"])

}

【运行结果】:

【说明】:

当vlaue类型为map时,与上例value类型为结构体Persion相似,只不过健值对处的value是一个map,但若非找出不相同之处,那就是map以泛型的形式出现,像本例中尽管age的值是整型,但由于泛型的要求,这里的年龄必须使用双引号括起来。

本文出自 “青客” 博客,请务必保留此出处http://qingkechina.blog.51cto.com/5552198/1620429

时间: 2024-09-30 15:48:41

【Go语言】【10】GO语言的map的相关文章

10种语言打造网络矩阵 为游客提供全方位互联网服务

南京市旅游委工作人员来京参观首都旅游产业运行监测调度中心. 拿起手机打开"i游北京"APP或者登录北京市旅游委官方网站"北京旅游网",游客不仅可以购买到北京众多景区的门票,而且能轻松查阅景区的舒适度指数,如果您是旅行团的游客,还可以查询到导游的资格和旅行社资质--这些都是本市智慧旅游的一部分,市旅游委为游客打造的正是融吃.住.行.游.购.娱为一体的游览体验.北京市旅游委城市形象与市场推介处处长卢川介绍,北京旅游网是目前全国语言版本最多的政府网站,多达10种语言,也正

Swift语言指南(一)--语言基础之常量和变量

原文:Swift语言指南(一)--语言基础之常量和变量 Swift 是开发 iOS 及 OS X 应用的一门新编程语言,然而,它的开发体验与 C 或 Objective-C 有很多相似之处. Swift 提供了 C 与 Objective-C 中的所有基础类型,包括表示整数的 Int,表示浮点数的 Double 与 Float,表示布尔值的 Bool,以及表示纯文本数据的 String. Swift 还为两个基本集合类型 Array 与 Dictionary 提供了强大的支持,详情可参考 (集合

Java语言与C++语言的差异总结

Java的设计者曾说过,设计这门语言的灵感主要来自于C++. 世上先有C++,然后才有Java,整个Java语言的发展历史就是一部对C++的填坑史.所以在Java语言学习过程中,将其与C++语言对比是一件有意义的事情.通过这些对比,我们能够了解到Java语言相对于C++语言有哪些改进,能带给我们哪些进步,这样对于更加深入理解这两种语言是大有裨益的. 下面我总结一下Java语言与C++语言的各种差异. 1.Java用来操纵对象的引用可以先初始化再指向对象,而C++的引用必须在初始化时就指向对象.

C#语言与Java语言程序的比较

迈入二十一世纪以来,信息行业飞速壮大,其中在软件开发中Java语言与C#语言都独当一面,得到了逐步完善和广泛的应用,Java语言和C#语言都是一种面向对象的语言,但Java程序和C#程序还是有一定的区别. 下面分别是两种语言的程序的例子. 1.Java语言的基本程序: Import java.util.*; Package HelloJava{ Public class Message{ Public static void main(String [] args){ System.out.pr

Thinkphp搭建包括JS多语言的多语言项目实现方法_php实例

本文实例讲述了Thinkphp搭建包括JS多语言的多语言项目实现方法.分享给大家供大家参考.具体实现方法如下: 一.问题: 项目需要开发英文版,于是需要搭建多语言项目. 项目使用Thinkphp框架,隐约记得Thinkphp有多语言设置,翻看了帮助手册,果然有,这就边实验边开始: 二.实现方法: Thinkphp采用app_begain来检测和切换语言包,语言包和项目相关,构架等都比较简单,具体的这里:http://www.thinkphp.cn/info/188.html 搭建好了,就可以使用

r语言-对一个向量的划分,求C语言或R语言实现

问题描述 对一个向量的划分,求C语言或R语言实现 1C 向量U={123456}利用R1属性划分为:U/R1={{123}{456}}利用R2属性划分为:U/R2={{12}{3456}}利用R3属性划分为:U/R3={{1234}{56}}最后得到划分的交集:U/R={{12}{3}{4}{56}}

Swift语言指南(三)--语言基础之整数和浮点数

原文:Swift语言指南(三)--语言基础之整数和浮点数   整数   整数指没有小数的整数,如42,-23.整数可以是有符号的(正数,零,负数),也可以是无符号的(正数,零). Swift提供了8,16,32,64位形式的有符号和无符号的整数,这些整数遵循与C语言相似的命名规则.如8位无符号整数的类型为UInt8,32位有符号整数的类型为Int32,和Swift语言的其它类型一样,这些整型命名以大写字母开头.   整数的边界 你可以通过min或max属性为每一个整数类型指定一个最小值或最大值:

各国语言缩写列表,各国语言缩写-各国语言简称,世界各国域名缩写

$amount = '12345.67'; $formatter = new \NumberFormatter('en_GB', \NumberFormatter::CURRENCY); echo 'UK: ' . $formatter->formatCurrency($amount, 'EUR') . '<br/>'; $formatter = new \NumberFormatter('de_DE', \NumberFormatter::CURRENCY); echo 'DE: '

c语言与c++语言之间的相互转化

问题描述 c语言与c++语言之间的相互转化 struct student*p0 scanf("%s",p0->num) scanf("%s",&p0->name) 解决方案 C++也能兼容C,直接编译看有没有什么语法错误 解决方案二: 对的,C++编译器本来就支持几乎所有C语法 你为何还需要改 C --> C++ #include scanf("%s",p0->num); --> std::cin >&

c语言-C语言递归函数C语言递归函数C语言递归函数

问题描述 C语言递归函数C语言递归函数C语言递归函数 #include<stdio.h> #include<stdlib.h> //用递归函数来计算N的阶乘 double factorial(int n) { double result; if(n<0) { printf("输入错误 "); } else if(n==1 ||n==0) { result=1; } else { result=factorial(n-1)*n; //n=5 5-1=4 4*