面试者与面试官

1、Go语言中的Map是有序的还是无序的,为什么?

在Go语言中,字典Map是无序的。

因此,如果使用 for … range 循环遍历的话每次迭代获得的 键 - 元素 对的顺序都可能是不同的。

在Go的内部实现中是先通过一个叫做fastrand()的函数生成一个随机数,然后使用这个随机数作为一个桶位置当作起始点开始进行遍历迭代的,这就导致每次遍历的起始位置不是固定的。

2、Map字典的键类型不能是哪些类型,应该优先考虑哪些类型作为字典的键类型呢?

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

因为 Go 语言的字典类型其实是一个哈希表(hash table)的特定实现,因此其中重要的一个步骤就是需要把键值转换为哈希值,所以,从性能的角度来看的话,“把键值转换为哈希值”以及“把要查找的键值与哈希桶中的键值做对比”, 都是比较耗时的操作。

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

3、在值为nil的字典上执行读操作会成功吗?

由于字典是引用类型,所以当我们仅声明而不初始化这个字典类型的变量时,这个变量的值就会是nil。

我们在这样一个值为nil的字典上执行读操作是没有问题的,但是如果是添加键 - 元素对的话,那Go 语言的运行时系统就会立即抛出一个 panic 致命性错误。