方式一:先声明,再初始化,然后赋值
// 先声明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工具包
官方离线安装包,亲测可用。使用rpm -ivh [rpm完整包名] 进行安装
标题 "golang-1.15.5集合" 指的是 Go 语言的一个特定版本——1.15.5的软件包集合。Go(又称Golang)是Google开发的一种静态类型的、编译型的、并发型的、垃圾回收的、C/C++风格的编程语言。1.15.5是其版本号,代表了...
在 Go 中使用 golang-odbc 驱动,首先需要确保你的系统已经安装了 ODBC 驱动程序和数据源。数据源是 ODBC 的一个重要概念,它是数据库连接的配置信息,包括数据库的类型、服务器地址、用户名、密码等。你可以通过...
本文将详细探讨“golang-linux-arm64 SDK”,揭示其核心特性和使用方法,帮助开发者更好地理解和利用这个强大的工具。 一、golang-linux-arm64 SDK简介 golang-linux-arm64 SDK是Go语言针对Linux操作系统和ARM64...
构建基础映像(可选) 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...
`golang-set`库提供了一种实现,包括线程安全和非线程安全的高性能集,非常适合在Go的并发环境中使用。 首先,我们要理解什么是线程安全和非线程安全。线程安全指的是在多线程环境下,一个函数或方法在同一时刻可以...
要使用golang-neo4j-bolt-driver,首先需要解压下载的zip文件,然后在Go项目中通过import导入库,并按照提供的示例代码建立连接、执行Cypher查询和管理事务。 六、示例代码 ```go package main import ( "fmt" ...
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完整包名] 进行安装
goLang-v1.23.2
官方离线安装包,亲测可用。使用rpm -ivh [rpm完整包名] 进行安装
golang-asm Go编译器的汇编器镜像,其中导入路径被重写,以使汇编器可用作独立的库。 按照Go项目的许可。地位工作,但希望挖掘到汇编godoc是制定出什么来设置不同的参数obj.Prog得到它产生的具体说明。例子演示在x86...
golang-常用的压缩算法golang-常用的压缩算法
官方离线安装包,亲测可用。使用rpm -ivh [rpm完整包名] 进行安装
开源项目-skx-golang-metrics.zip,Automatically submitting golang-system metrics to a remote carbon/graphite server
go get github.com/tkrajina/typescriptify-golang-structs/tscriptify 图书馆: go get github.com/tkrajina/typescriptify-golang-structs 用法 使用命令行工具: tscriptify -package=package/with/your/...
开源项目-alaska-golang-ref-sheet.zip,alaska/golang-ref-sheet: A golang quick reference sheet. Your one stop concurrency shop!
官方离线安装包,亲测可用