我注意到,当迭代映射中的键和值时,它们的键和值都共享相同的内存地址。你可以在这里看到:
package main
import "fmt"
func main() {
myMap := map[string]string{
"hello": "world",
"how": "are",
"you": "today?",
}
for key, value := range myMap {
fmt.Printf("Key: %p %v\n", &key, key)
fmt.Printf("Value: %p %v\n", &value, value)
fmt.Println("---")
}
}
Run Code Online (Sandbox Code Playgroud)
...输出...
Key: 0xc00009e210 hello
Value: 0xc00009e220 world
---
Key: 0xc00009e210 how
Value: 0xc00009e220 are
---
Key: 0xc00009e210 you
Value: 0xc00009e220 today?
---
Run Code Online (Sandbox Code Playgroud)
这是为什么?
您没有获取地图中值的地址。实际上,Map 元素在 Go 中是不可寻址的。您正在获取本地循环变量的地址,称为“ key”和“ value”。这些在每次循环迭代中都不会改变,因为它们没有理由改变(它们被重新使用)。
看:
为什么 Go 禁止取 (&) 映射成员的地址,却允许取 (&) 切片元素?