深入探讨Go中的字典
admin
2024-03-16 23:15:08
0

深入探讨Go中的字典

文章目录

  • 深入探讨Go中的字典
    • 一、字典的简单用法
    • 二、字典的键类型不能是哪些类型
    • 三、应该优先考虑那些类型作为字典的键类型
    • 四、在值为nil的字典上执行操作,会报错吗?
    • 五、字典的并发问题

一、字典的简单用法

package mainimport ("fmt"
)/*
输出:
这个元素key "one":1
*/
func main() {aMap := map[string]int{"one":   1,"two":   2,"three": 3,}k := "one"v, ok := aMap[k]if ok {fmt.Printf("这个元素key %q:%d\n", k, v)} else {fmt.Println("没有发现!")}
}

二、字典的键类型不能是哪些类型

  • Go语言字典的键类型不可以是函数类型、字典类型和切片类型

键类型的值必须支持判等操作(可以施加操作符==和!=)。由于函数类型、字典类型、切片类型,不支持判等操作,所以字典的键类型不能是这些类型。

  • 另外,如果键类型是接口类型,那么键值的实际类型也不能是上述三种类型。
package mainimport ("fmt"
)/*
引起恐慌的示例
*/
func main() {var badMap2 = map[interface{}]int{"1":      1,3:        3,[]int{2}: 2, //  panic: runtime error: hash of unhashable type []int}fmt.Println(badMap2)
}

上面的代码,编译时不会出错。因为通过接口类型躲过了Go语言编译器的检查。

最好,不要把字典的键类型设定为任何接口类型。

  • 如果键的类型是数组类型,还要确保该数组类型的元素类型不是函数类型、字典类型或切片类型;
  • 如果键的类型是结构体类型,那么还要确保其中字段的类型的合法性;

三、应该优先考虑那些类型作为字典的键类型

求哈希和判等操作的速度越快,对应的类型就越适合作为键类型。

对于所有的基本类型、指针类型、以及数组类型、结构体类型和接口类型。Go语言都有一套算法与之对应。这套算法中就包含了哈希和判等。

以求哈希值为例,宽度越小的类型速度通常越快。对于字符串类型,由于它的宽度是不定的,所以要看它的值的具体长度,长度越短求哈希越快。

类型的宽度是指单个值需要占用的字节数。

对于高级类型:

  • 数组的哈希值,实际上是求得数组的每个元素的哈希值,并进行合并。所以,速度取决于元素类型以及它的长度;
  • 结构体类型的值求哈希,实际上是对它的所有字段值求哈希并进行合并,所以,关键在于它的各个字段的类型以及字段的数量。
  • 对于接口类型而言,具体的哈希算法,由值的实际类型决定。

不建议使用高级类型作为字典的键类型。(因为对它们的值求哈希,以及判等的速度较慢。)

建议优先选用数值类型和指针类型作为键类型。

四、在值为nil的字典上执行操作,会报错吗?

package mainimport "fmt"func main() {var m map[string]int// m = map[string]int{} // 补充上这句话,下面的执行就不会引起恐慌了fmt.Println(m)key := "one"v01, ok := m[key] // 不会引起恐慌fmt.Printf("在值为nil的map中获取key为 %q 的值:%d,%v\n", key, v01, ok)fmt.Printf("map的长度为:%d\n", len(m))fmt.Printf("在值为nil的map上删除key为 %q\n", key)delete(m, key) // 不会引起恐慌fmt.Println("向值为nil的map上添加一个元素,会引起恐慌")m[key] = 2
}

五、字典的并发问题

非原子操作需要加锁, map并发读写需要加锁,map操作不是并发安全的,判断一个操作是否是原子的可以使用 go run race 命令做数据的竞争检测。

相关内容

热门资讯

原创 意... 美国关税带来的冲击已经对全球经济格局产生了影响。报道显示,意大利在2025年下半年的全球出口额超过了...
原创 A... 上证指数月线3连阳了,不出意外的话就又要创10年新高了。 从盈亏角度,体感很不好,不是没有上涨而是所...
Jellycat卖爆背后:Z世... 文丨特约撰稿 阿杜 刚刚结束的春节期间里,春晚无疑是最为关注的热门词之一,如果不是重温12年前的这场...
京津冀地区去年进出口值4.7万... 从天津海关获悉,京津冀协同发展上升为国家战略以来,京津冀地区进出口值从2014年的3.74万亿元增至...
绝对稀缺资源!吃透【稀土+小金... 很多人都在担心,AI 是否会抢走自己的饭碗。 但很多人没意识到,AI 再厉害,也造不出地下的稀缺资源...
原创 世... 翻起1995年的《财富》世界500强榜单,那种差距真的让人印象深刻——这是全球首次发布这份榜单,美国...
皮海洲:如何给投资者发放“春节... 皮海洲 | 立方大家谈专栏作者 给投资者发“春节红包”,这是近年来管理层比较重视的一件事件,并将此视...
刘强东和雷军登上新闻联播,排面... 来源:市场资讯 (来源:电商行业) 东哥和雷总,从创业时期就开始并肩作战,如今又携手走上了国际舞台...
“硅王”协鑫孵化的徐州独角兽冲... 文/徐培琪 马年首单获受理的IPO项目,花落徐州半导体材料独角兽——江苏鑫华半导体科技股份有限公司(...
成交价6604万!南京老洋房“... 2月27日,南京市老洋房“张治中公馆”在阿里资产平台成功法拍。此次拍卖有3.9万余人次围观。经过两名...
双良节能、捷荣技术、海泰发展被... 财联社2月27日讯,今日晚间,双良节能、捷荣技术、海泰发展相继发布公告称被证监会立案,其中双良节能涉...
血亏1800亿后,全球第四大车... 前不久,Stellantis集团发布其2025年全年财务业绩,预料之内的,堪称史诗级灾难的财务表现—...
涨停复盘:今日全市场共92只股... 2月27日,三大指数涨跌不一,上证指数收涨0.39%,创业板指跌1.04%。沪深两市成交额合计2.4...
AI技术下沉惠民 和田地区智慧... 2月26日,在新疆医科大学与新疆工程学院的大力支持下,和田地区AI+智慧医疗辅助诊断成果转化示范基地...
证监会召开资本市场“十五五”规... 据证监会消息,2月27日证监会党委书记、主席吴清在北京召开座谈会,与8家在华外资证券基金期货机构代表...
珠江啤酒四季度由盈转亏 销量增... 来源:新浪财经 出品:新浪财经上市公司研究院 作者:郝显 2月25日,珠江啤酒发布 2025 年度业...
马斯克:特斯拉将在20年内上月... 继提出xAI要在月球建造AI卫星工厂后,马斯克又称20年内特斯拉工厂也将现身月球。 2月27日,特斯...
苏州看弱精好的中医推荐:孙嗣章... 在苏州国医堂名医工作室,常有男性患者攥着精液分析报告局促不安,他们口中常念叨着“苏州哪里看弱精好”“...
AI智能客服与AI京东客服的行... 一、3C数码配件类目客服的结构性矛盾 3C数码配件属于高频消费、强兼容性、强参数属性类目,用户集中关...