加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

《Effective Go》--Maps

发布时间:2020-12-16 19:08:46 所属栏目:大数据 来源:网络整理
导读:????Map是一种方便,强大的内建数据结构,其将一个类型的值(key)与另一个类型的值(element或value) 关联一起。 key可以为任何定义了等于操作符的类型,例如整数,浮点和复数,字符串,指针,接口(只要其动态类型支持等于操作),结构体和数组 。切片不

????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 main

import (
    "fmt"
)

func main() {
    var timeZone = map[string]int{
        "UTC":  0*60*60,}
    t1 := timeZone["EST"]
    fmt.Println(t1)
    t2 := timeZone["EST222221"]
    fmt.Println(t2)
}

输出结果:

????有时你需要区分开没有的项和值为零的项。是否有一个项为”UTC”,或者由于其根本不在map中,所以为空字符串?你可以通过多赋值的形式来进行辨别。

var seconds int
var ok bool
seconds,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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读