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

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的值是整型,但由于泛型的要求,这里的年龄必须使用双引号括起来。

时间: 2025-01-05 12:04:51

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

[C语言 - 10] C语言保留字

一  数据类型关键字 12 个: 1 . char 2 . short 3 . int 4 . long 5. enum 6. float 7. double 8. signed 9. unsigned 10. struct 11. union 12.void 二 控制类型关键字 12 个 循环语句 1.for 2.do 3.while 4. break 5.continue 条件语句 6.if 7.else 8.goto 开关语句 9.switch 10.case 11.default 返回语

10. Go 语言反射

Go 语言反射 反射是指在程序运行期对程序本身进行访问和修改的能力.程序在编译时,变量被转换为内存地址,变量名不会被编译器写入到可执行部分.在运行程序时,程序无法获取自身的信息. 支持反射的语言可以在程序编译期将变量的反射信息,如字段名称.类型信息.结构体信息等整合到可执行文件中,并给程序提供接口访问反射信息,这样就可以在程序运行期获取类型的反射信息,并且有能力修改它们. Go程序在运行期使用reflect包访问程序的反射信息. 其它语言中的反射 C/C++ 语言没有支持反射功能,只能通过 ty

go语言系列-从数组到map

数组 数组可以存放多个同一类型数据.数组也是一种数据类型,在Go中,数组是值类型 一个养鸡场有6只鸡,它们的体重分别是3kg,5kg,1kg,3.4kg,2kg,50kg.请问这六只鸡的总体重是多少?平均体重是多少? 使用传统的方法不利于数据的管理和维护 传统的方法不够灵活,因此我们引出需要学习的新的数据类型 ==>数组 //使用数组的方式来解决问题 var 数组名 [数组大小]数据类型 var a [5]int 赋初值 a[0] = 1 a[1] = 30 ... func main() {

51系列小型操作系统精髓 简单实现10 C语言版优化后发布(有图)

4个任务 /* 使用keil4 可运行8个任务 任务从rtos_wait()处切换,在定时时间到后从定时中断中切换回来. */ #include "STC12C5A.H" #define TIMER_RELOAD() {TL0=0x00;TH0=0xC4;}//使能T/C 初始10ms #define MAX_TASKS 8 //任务槽最大个数. unsigned char idata task_stack[MAX_TASKS][2];//任务堆栈. PC指针为16位,需2个字节tas

Go语言学习笔记十三: Map集合

Go语言学习笔记十三: Map集合 Map在每种语言中基本都有,Java中是属于集合类Map,其包括HashMap, TreeMap等.而Python语言直接就属于一种类型,写法上比Java还简单. Go语言中Map的写法比Java简单些,比Python繁琐. 定义Map var x map[string]string x : = make(map[string]string) 写法上有些奇怪,map为关键字,右侧中括号内部为key的类型,中括号外部为value的类型.一般情况下使用逗号或者冒号

6、Struts2中的国际化、Ognl(对象图导航语言)表达式语言

Struts2中的国际化.Ognl(对象图导航语言)表达式语言 回顾:Servlet 中国际化: 1). 写资源文件 基础名.properties [默认的语言环境的配置] 基础名语言简称国家简称.properties 2). 读取资源文件,再使用 程序:ResourceBundle Jsp: jstl提供的格式化与国际化标签库. 一.Struts2中国际化: 1. 写资源文件 (同servlet) 2. 读资源文件 程序:ResourceBundle (同servlet) JSP: 1)jst

Go语言之GO 语言引用类型

GO 语言引用类型 Go 语言切片 Go 语言切片(Slice) Go 语言切片是对数组的抽象. Go 数组的长度不可改变,在特定场景中这样的集合就不太适用,Go中提供了一种灵活,功能强悍的内置类型切片("动态数组"),与数组相比切片的长度是不固定的,可以追加元素,在追加时可能使切片的容量增大. 定义切片 申明一个未指定大小的数组来定义切片: var identifier []type 切片不需要说明长度. 或使用make()函数来创建切片: var slice1 []type = m

Go语言之Go语言反射

GO 语言反射 反射是指在程序运行期对程序本身进行访问和修改的能力.程序在编译时,变量被转换为内存地址,变量名不会被编译器写入到可执行部分.在运行程序时,程序无法获取自身的信息. 支持反射的语言可以在程序编译期将变量的反射信息,如字段名称.类型信息.结构体信息等整合到可执行文件中,并给程序提供接口访问反射信息,这样就可以在程序运行期获取类型的反射信息,并且有能力修改它们. Go 语言反射 Go语言提供了一种机制在运行时更新和检查变量的值.调用变量的方法和变量支持的内在操作,但是在编译时并不知道这

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

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

C语言代写,C语言作业代写,代写C语言,C语言编程代写

C语言代写,C语言作业代写,代写C语言,C语言编程代写 我是一线IT企业程序员,目前接各种代码代写业务: 代写C语言.代做C语言.C语言作业代写.C语言代写 代写C++.代做C++.C++作业代写.C++作业代写 代写Python.代做Python.Python作业代写.Python作业代做 代写Java.代做Java.Java作业代写.Java作业代做 代写编程作业.代做编程.编程代写.编程代做 先写代码再给钱,不要任何定金!价钱公道,具体见图,诚信第一!(涉及图形化界面.或领域类知识如金融数