为什么 Go 中的映射文字允许在使用函数调用而不是文字时覆盖键?

Sir*_*our 3 dictionary go

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"将导致编译时错误,这是预期的行为。

Bur*_*dar 9

形式的地图文字:

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)

这将创建一个包含一个元素的映射文字,然后使用给定函数的结果设置第二个元素。

重写密钥是一个有效的操作,这就是它不会恐慌的原因。