首先要明白一件事,什么叫不可寻址?它指的是,不能通过 &
来获得内存地址的行为。
以常量为例
import "fmt"
const VERSION = "1.0"
func main() {
fmt.Println(&VERSION)
}
编译的时候会直接报错说:无法取得 VERSION 的地址。因为它是常量
$ go build main.go
# command-line-arguments
./main.go:8:14: cannot take the address of VERSION
这其实还挺容易理解的,如果常量可以寻址的话,我们就可以通过指针修改常数的值,这无疑破坏了常数的定义。
那么字典里的元素呢?为什么它不可以寻址?
func main() {
p := map[string]string {
"name": "iswbm",
}
fmt.Println(&p["name"])
// cannot take the address of p["name"]
}
它比较特殊,可以从两个角度来反向推导,假设字典的元素是可寻址的,会出现什么问题呢?
字典的使用无非两种情况,我们分别来探讨一下
基于这两点,Map 中的元素不可寻址,符合常理。
字符串是不可变的,你想要修改其中某个字符,是做不到的。
func main() {
name := "iswbm"
name[0] = 'x' // can not assign to name[0]
}
因此字符串的字节或者字符不可寻址,没有问题。
注意区分如下这种写法
name = "golang"
只是将 name 指向了一个新的内存地址,这个新的内存地址存的是值是 golang
,实际上你并没有改变原字符串 iswbm
的内存地址里存储的值。
func main() {
name := "iswbm"
name = "golang"
fmt.Println(name)
}