Golang 不可寻址的理解

如果没有听过 Golang 的不可寻址(not addressable)相关概念,没有关系,从字面上看,就是无法获取值的地址。先举个简单的例子:

1
2
3
4
5
6
7
8
package main

import "fmt"

func main() {
m := map[int]string{0: "hello"}
fmt.Printf("%p", &m[0])
}

m 是 map[int]string 类型,只包含一个键值对,打印这个键值对的值的地址,直接编译错误:cannot take the address of m[0],无法获取 map 中值的地址。这是个比较常见的不可寻址的例子。原因也比较简单,map 类型是通过哈希表实现的,随着 map 元素的增多,可能触发扩容,那么 map 的值的位置发生改变,即其地址会发生变化,所以无法对 map 的值寻址。

再看个稍微复杂的例子,在Golang wiki 的 MethodSets 有这样一句话:

The concrete value stored in an interface is not addressable, in the same way that a map element is not addressable.

意思具体值赋值给 interface 类型后与 map 中的元素一样是不可寻址的。先不去理解这句话,先看个例子:

本文结束 感谢阅读