是否可以使用动态值类型创建映射,以将浮点值和字符串值存储在单个映射中?
26:30
答案 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")
}
}
您可以在转换案例中添加任意数量的类型以获取值