package main
import "fmt"
func main() {
blaa := map[string]string{
"key": "value",
getKey(): "value2", //replacing getKey() with "key" results in compile time error.
}
fmt.Println("Hello, " + blaa["key"])
}
func getKey() string {
return "key"
}
Run Code Online (Sandbox Code Playgroud)
运行上面的程序将打印“Hello, value2”。在这里尝试一下https://go.dev/play/p/s92LaaNc3n4
虽然我可以看到密钥被覆盖,但我想知道为什么这panic在运行时不会被覆盖?使用两个字符串文字"key"将导致编译时错误,这是预期的行为。
形式的地图文字:
blaa := map[string]string{
"key": "value",
"key": "value2",
}
Run Code Online (Sandbox Code Playgroud)
是一个编译时错误,因为所有值在编译时都是已知的,并且具有重复键的映射是无效的映射文字。
以下是在运行时计算的:
blaa := map[string]string{
"key": "value",
getKey(): "value2",
}
Run Code Online (Sandbox Code Playgroud)
这将创建一个包含一个元素的映射文字,然后使用给定函数的结果设置第二个元素。
重写密钥是一个有效的操作,这就是它不会恐慌的原因。