映射为动态值类型?

时间:2018-09-22 07:26:58

标签: dictionary go dynamic interface

是否可以使用动态值类型创建映射,以将浮点值和字符串值存储在单个映射中?

26:30

1 个答案:

答案 0 :(得分:4)

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

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")
        }
    }
}

Playground上工作的代码

  

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

var x interface{}  // x is nil and has static type interface{}
var v *T           // v has value nil, static type *T
x = 42             // x has value 42 and dynamic type int
x = v              // x has value (*T)(nil) and dynamic type *T

如果您不输入类型,请使用开关将值提取为:

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")
    }
}

您可以在转换案例中添加任意数量的类型以获取值