<>

作者: 凹大猫的鱼 | 来源:发表于2018-09-29 14:57 被阅读0次

字典的操作和约束#


字典的初始化

// 先声明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",
}

字典的底层就是个哈希表。

字典的key必须是能进行==和!=操作 ,这个是因为在查找的时候,会根据哈希值先找到哈希表对应的值,但这个值里面可能包含了多个key-value对(哈希碰撞),所以说需要再对key进行比较,才能确定是不是对应的value。

字典的key不允许 字典类型,切片类型,函数类型,因为不支持==和!=操作

Note:
    
    var badMap2 := map[interface{}] int{
                    "1",    1
                    []int{2}:2    //引发panic
                    3:3
        }

    这种声明用interface的确可以逃过编译器编译阶段,但在运行的时候就会触发panic异常了。

优先考虑哪些类型作为key

因为key要求哈希值和进行比较,所以求哈希值越快的类型越好。
求哈希值的速度和值类型的宽度相同(字节数)。
所以优先选用数值类型和指针类型。

对空的map进行操作

对nil的map除了添加新元素外,可以进行任何的操作!!!!!

但切记不要添加元素,否则触发panic!!!!!!!!!!!!!!!!!

思考题

在不同的goroutine 里面对map操作是安全的吗?或者说map是并发安全的吗??

不是并发安全的,对于并发安全可以用go run -race 来做数据的竞争检测。

相关文章

  • <>

    字典的操作和约束# 字典的初始化 字典的底层就是个哈希表。 字典的key必须是能进行==和!=操作 ,这个是因为在...

  • Go核心36讲笔记

    Part1 .GO 语言安装的时候主要有三个环境变量:GOROOT、GOPATH 和 GOBIN通过 go env...

  • <>

    第一章重点: 该系列主要对郝林老师的课程做个人总结!!!文章在个人git下面,README里面写了郝林老师的课程地...

  • <>

    第二章重点: Go 的源码文件分类: 在第一章的时候已经提及到了这个关键问题: GO语言的flag包: 微课堂主要...

  • <>

    第三章重点: 第三章主要讲的是代码的管理,在第一章里面有的东西已经写进去了,这里按照老师的课程总结一下: 1. 同...

  • <>

    第四章重点: 变量的声明方式 go语言的类型推断有哪些好处 函数重声明的意思 代码块概念: 重声明的前提条件 思考...

  • <>

    第五章重点: 这一章主要是讲了go语言的模块的嵌套和查找规则 思考题 如果我们在go语言查找标识符范围的时候,用了...

  • <>

    第六章重点: go语言数据类型:基础类型(数字,字符串,布尔类型),复合类型(数组,结构体),引用类型(指针,切片...

  • <>

    数组和切片 切片和数组的区别 数组是属于值类型。结构体,基础类型数据也属于值类型。 注意GO语言对于“传值和传引用...

  • <>

    container里面的容器 主要介绍了list的使用规则,主要重点都是围绕使用来的。注意下面几点即可: 链表的开...

网友评论

      本文标题:<>

      本文链接:https://www.haomeiwen.com/subject/zmtboftx.html