《Effective Go》--Maps
来源:互联网 发布:电脑无线wifi软件 编辑:程序博客网 时间:2024/06/06 17:18
Map是一种方便,强大的内建数据结构,其将一个类型的值(key)与另一个类型的值(element或value) 关联一起。key可以为任何定义了等于操作符的类型,例如整数,浮点和复数,字符串,指针,接口(只要其动态类型支持等于操作),结构体和数组。切片不能 作为map的key,因为它们没有定义等于操作。和切片类似,map持有对底层数据结构的引用。如果将map传递给函数,其对map的内容做了改变,则这 些改变对于调用者是可见的。
Map可以使用通常的复合文字语法来构建,使用分号分隔key和value,这样很容易在初始化的时候构建它们。
var timeZone = map[string]int{ "UTC": 0*60*60, "EST": -5*60*60, "CST": -6*60*60, "MST": -7*60*60, "PST": -8*60*60,}
赋值和获取map的值,在语法上看起来跟数组和切片类似,只不过索引不需要为一个整数。
offset := timeZone["EST"]
尝试使用一个不在map中的key来获取map值,将会返回map中元素相应类型的零值。例如,如果map包含的是整数,则查找一个不存在的key将会返回0。
package mainimport ( "fmt")func main() { var timeZone = map[string]int{ "UTC": 0*60*60, "EST": -5*60*60, "CST": -6*60*60, "MST": -7*60*60, "PST": -8*60*60, } t1 := timeZone["EST"] fmt.Println(t1) t2 := timeZone["EST111111"] fmt.Println(t2)}
输出结果:
有时你需要区分开没有的项和值为零的项。是否有一个项为”UTC”,或者由于其根本不在map中,所以为空字符串?你可以通过多赋值的形式来进行辨别。
var seconds intvar ok boolseconds, ok = timeZone[tz]
这被形象的称作为“comma ok”用法。在这个例子中,如果tz存在,seconds将被设置为适当的值,ok将为真;如果不存在,seconds将被设置为零,ok将为假。这有个例子,并增加了一个友好的错误报告:
func offset(tz string) int { if seconds, ok := timeZone[tz]; ok { return seconds } log.Println("unknown time zone:", tz) return 0}
如果只测试是否在map中存在,而不关心实际的值,你可以将通常使用变量的地方换成空白标识符(_)
_, present := timeZone[tz]
要删除一个map项,使用delete内建函数,其参数为map和要删除的key。即使key已经不在map中,这样做也是安全的。
delete(timeZone, "PDT") // Now on Standard Time
本文整理自:https://www.kancloud.cn/kancloud/effective/72207
个人微信公众号:
作者:jiankunking 出处:http://blog.csdn.net/jiankunking
- 《Effective Go》--Maps
- Go-Maps
- Effective go
- Go Effective
- go语言Exercise: Maps
- Go by Example: Maps
- Go?GO!(五) Effective Go
- 《Effective Go》--defer
- 《Effective Go》--空白标识符
- go语言Arrays、Maps、Slices操作
- Effective Go(官方文档)笔记
- maps
- maps
- Maps
- effective
- Go!
- GO
- GO !
- 用创新产品和共赢生态,推动智能安防产业发展
- Banner的使用详解
- 软小二︱腾讯喊话 ISV 沉下心来搞事情,企业微信11月15日北京现场直接发你红包!
- jeesite手机端只有登录和系统首页,没有别的页面功能详解
- 用css和JavaScript分别实现水平垂直居中
- 《Effective Go》--Maps
- Linuxer-"Linux开发者自己的媒体"第四月稿件录取和赠书名单
- 安卓自定义Dialog(三)
- AngularJs之路由配置(一)
- Hibernate
- 多播(组播)
- java的基本类型一定存放在栈中吗?
- 深入JVM字节码执行引擎
- 18岁博士毕业的神童——“控制论之父”维纳