方式一:先声明,再初始化,然后赋值
// 先声明map
var m1 map[string]string
// 再使用make函数创建一个非nil的map,nil map不能赋值
m1 = make(map[string]string)
// 最后给已声明的map赋值
m1["a"] = "aa"
m1["b"] = "bb"
方式二:直接创建,然后赋值
// 直接创建
m2 := make(map[string]string)
// 然后赋值
m2["a"] = "aa"
m2["b"] = "bb"
方式三:创建的同时完成初始化
// 初始化 + 赋值一体化
m3 := map[string]string{
"a": "aa",
"b": "bb",
}
==========================================
// 查找键值是否存在
if v, ok := m1["a"]; ok {
fmt.Println(v)
} else {
fmt.Println("Key Not Found")
}
// 遍历map
for k, v := range m1 {
fmt.Println(k, v)
}
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
在C++/Java中,map一般都以库的方式提供,比如在C++中是STL的std::map<>,在C#中是Dictionary<>,在Java中是Hashmap<>,在这些语言中,如果要使用map,事先要引用相应的库。而在Go中,使用map不需要引入任何库,并且用起来也更加方便。
map是一堆键值对的未排序集合。比如以身份证号作为唯一键来标识一个人的信息,则这个map可以定义
package main
import "fmt"
// PersonInfo是一个包含个人详细信息的类型
type PersonInfo struct {
ID string
Name string
Address stringF
}
func main() {
var personDB map[string]PersonInfo
personDB = make(map[string]PersonInfo)
// 往这个map里插入几条数据
personDB["12345"] = PersonInfo{"12345", "Tom", "Room 203,..."}
personDB["1"] = PersonInfo{"1", "Jack", "Room 101,..."}
// 从这个map查找键为"1234"的信息
person, ok := personDB["1234"]
// ok是一个返回的bool型,返回true表示找到了对应的数据
if ok {
fmt.Println("Found person", person.Name, "with ID 1234.")
} else {
fmt.Println("Did not find person with ID 1234.")
}
}
上面这个简单的例子基本上已经覆盖了map的主要用法,下面对其中的关键点进行细述。
1. 变量声明
map的声明基本上没有多余的元素,比如:
var myMap map[string] PersonInfo
其中,myMap是声明的map变量名,string是键的类型,PersonInfo则是其中所存放的值类型。
2. 创建
我们可以使用Go语言内置的函数make()来创建一个新map。下面的这个例子创建了一个键类型为string、值类型为PersonInfo的map:
myMap = make(map[string] PersonInfo)
也可以选择是否在创建时指定该map的初始存储能力,下面的例子创建了一个初始存储能力为100的map:
myMap = make(map[string] PersonInfo, 100)
创建并初始化map的代码如下:
myMap = map[string] PersonInfo{
"1234": PersonInfo{"1", "Jack", "Room 101,..."},
}
3. 元素赋值
赋值过程非常简单明了,就是将键和值用下面的方式对应起来即可:
myMap["1234"] = PersonInfo{"1", "Jack", "Room 101,..."}
4. 元素删除
Go语言提供了一个内置函数delete(),用于删除容器内的元素。下面我们简单介绍一下如何用delete()函数删除map内的元素:
delete(myMap, "1234")
上面的代码将从myMap中删除键为“1234”的键值对。如果“1234”这个键不存在,那么这个调用将什么都不发生,也不会有什么副作用。但是如果传入的map变量的值是nil,该调用将导致程序抛出异常(panic)。
5. 元素查找
在Go语言中,map的查找功能设计得比较精巧。而在其他语言中,我们要判断能否获取到一个值不是件容易的事情。判断能否从map中获取一个值的常规做法是:
(1) 声明并初始化一个变量为空;(2) 试图从map中获取相应键的值到该变量中;(3) 判断该变量是否依旧为空,如果为空则表示map中没有包含该变量。这种用法比较啰唆,而且判断变量是否为空这条语句并不能真正表意(是否成功取到对应的值),从而影响代码的可读性和可维护性。有些库甚至会设计为因为一个键不存在而抛出异常,让开发者用起来胆战心惊,不得不一层层嵌套try-catch语句,这更是不人性化的设计。在Go语言中,要从map中查找一个特定的键,可以通过下面的代码来实现:
value, ok := myMap["1234"]
if ok { // 找到了
// 处理找到的value
}
判断是否成功找到特定的键,不需要检查取到的值是否为nil,只需查看第二个返回值ok,这让表意清晰很多。配合:=操作符,让你的代码没有多余成分,看起来非常清晰易懂。
分享到:
相关推荐
weixin-golang-sdk 微信golang工具包
golang-china读书笔记.pdf
build-web-application-with-golang-en. build-web-application-with-golang-en. build-web-application-with-golang-en.
官方离线安装包,亲测可用。使用rpm -ivh [rpm完整包名] 进行安装
构建基础映像(可选) docker build -f Dockerfile_builder -t goreng/golang-cross-builder:1.15.1 . 请先按照指南 建立跨语言的图像docker build --build-arg GO_VERSION=1.16.2 --build-arg GOLANG_DIST_SHA=542...
开源项目-SaturnsVoid-GoLANG-Google-Chrome-Password-Recovery.zip,GoLANG-Google-Chrome-Password-Recovery
golang-odbc 驱动
build-web-application-with-golang-master.zip github上一本golang书的源文件获取后压缩
golang-src-1.15.5-1.el7.noarch golang-1.15.5-1.el7.x86_64 golang-bin-1.15.5-1.el7.x86_64
golang-stats-api-handler, Golang cpu,内存,gc等信息api处理程序 golang-stats-api-handlerGolang cpu,内存,gc等信息api处理程序。 安装go get github.com/fukata/golang-stats-api-handler示
官方离线安装包,测试可用。使用rpm -ivh [rpm完整包名] 进行安装
好书不需介绍,急需者自知价值
The-Golang-Standard-Library-by-Example-master.zip
官方离线安装包,亲测可用。使用rpm -ivh [rpm完整包名] 进行安装
build-web-application-with-golang-zh.pdf go web编程学习资料
开源项目-NanXiao-golang-101-hacks.zip,Golang 101黑客
官方离线安装包,亲测可用。使用rpm -ivh [rpm完整包名] 进行安装
go1.8.3-golang-linux-mips-openwrt-lede,go语言1.8.3在mips芯片的openwrt路由器上运行
开源项目-skx-golang-metrics.zip,Automatically submitting golang-system metrics to a remote carbon/graphite server
开源项目-alaska-golang-ref-sheet.zip,alaska/golang-ref-sheet: A golang quick reference sheet. Your one stop concurrency shop!