Dictionary 具有动态值类型的映射?

Dictionary 具有动态值类型的映射?,dictionary,go,dynamic,interface,Dictionary,Go,Dynamic,Interface,有没有办法创建一个动态值类型的映射,在一个映射中存储浮点值和字符串值 myMap["key"] = 0.25 myMap["key2"] = "some string" 您可以使用接口{}作为映射的值,该映射将存储您传递的任何类型的值,然后使用类型断言获取基础值 package main import ( "fmt" ) func main() { myMap := make(map[string]interface{}) myMap["key"] = 0.25

有没有办法创建一个动态值类型的映射,在一个映射中存储浮点值和字符串值

myMap["key"] = 0.25
myMap["key2"] = "some string"

您可以使用
接口{}
作为映射的值,该映射将存储您传递的任何类型的值,然后使用类型断言获取基础值

package main

import (
    "fmt"
)

func main() {
    myMap := make(map[string]interface{})
    myMap["key"] = 0.25
    myMap["key2"] = "some string"
    fmt.Printf("%+v\n", myMap)
    // fetch value using type assertion
    fmt.Println(myMap["key"].(float64))
    fetchValue(myMap)
}

func fetchValue(myMap map[string]interface{}){
    for _, value := range myMap{
        switch v := value.(type) {
            case string:
                fmt.Println("the value is string =", value.(string))
            case float64:
                fmt.Println("the value is float64 =", value.(float64))
            case interface{}:
                fmt.Println(v)
            default:
                fmt.Println("unknown")
        }
    }
}
工作守则

接口类型的变量也有一个不同的动态类型,即 是在运行时分配给变量的值的具体类型 (除非该值是预先声明的标识符nil,它没有 类型)。动态类型在执行期间可能会有所不同,但存储在 接口变量始终可分配给 变数

如果不使用类型,请使用开关获取值,如下所示:

func question(anything interface{}) {
    switch v := anything.(type) {
        case string:
            fmt.Println(v)
        case int32, int64:
            fmt.Println(v)
        case SomeCustomType:
            fmt.Println(v)
        default:
            fmt.Println("unknown")
    }
}

您可以在交换机机箱中添加任意数量的类型以获得值

谢谢!如果我需要将值转换为字符串(或其他),但我不知道值的类型,我可以这样做吗?例如,如果我将循环所有映射并尝试将每个值打印到控制台?@Martin yes如果您不知道类型,您可以使用switch获取值。@Martin您可以检查我编辑的答案,在那里您可以获取值的类型。仅供参考,还有sync.map,它的作用类似于map[interface{}]interface{}但也提供同步保证。@Mikhail是的,但最好不要使用它,除非您想使用它的所有嵌入功能,或者您将它与go例程一起使用。
func question(anything interface{}) {
    switch v := anything.(type) {
        case string:
            fmt.Println(v)
        case int32, int64:
            fmt.Println(v)
        case SomeCustomType:
            fmt.Println(v)
        default:
            fmt.Println("unknown")
    }
}