Карта с динамическим типом значения? - PullRequest
0 голосов
/ 22 сентября 2018

Есть ли способ создать карту с динамическим типом значения, чтобы сохранить в одной карте как плавающие, так и строковые значения?

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

1 Ответ

0 голосов
/ 22 сентября 2018

Вы можете использовать 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")
    }
}

Вы можете добавить столько типов, сколько вы хотите в переключателе, чтобы получить значение

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...