почему я получаю странный результат при утверждении типа в go lang? - PullRequest
0 голосов
/ 06 января 2020

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

var i interface{}
s := make([]map[string]interface{}, 5, 5)
i = s
switch x := i.(type) {
    case []interface{}:
        fmt.Println("type is an array")
        fmt.Println("length is: ")
        fmt.Println(len(x))
    case []map[string]interface{}:
        fmt.Println("type is an array")
        fmt.Println("length is: ")
        fmt.Println(len(x))

  }

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

switch x := i.(type) {
case []interface{}, []map[string]interface{}:
    fmt.Println("type is an array")
    fmt.Println("length is: ")
    fmt.Println(len(x))

}

Ответы [ 2 ]

3 голосов
/ 06 января 2020

См. Спецификацию языка:

TypeSwitchGuard может включать в себя краткое объявление переменной. Когда эта форма используется, переменная объявляется в конце TypeSwitchCase в неявном блоке каждого предложения. В предложениях с регистром дел точно одного типа переменная имеет этот тип; в противном случае переменная имеет тип выражения в TypeSwitchGuard.

Кроме того, помните, что Go имеет статическую типизацию. Вы не можете определить тип переменной, которую вы объявляете во время выполнения. Поэтому, если вы перечисляете несколько типов, он просто объявляет переменную, используя тот же тип, что и переменная switch.

2 голосов
/ 06 января 2020

Единственная проблема здесь:

fmt.Println(len(x))

Во время выполнения во второй версии Go не знает, является ли x []interface{} или []map[string]interface{}, поэтому он делает это просто interface{}. В то время как базовый тип является [] (чего-то), фактический тип x на данный момент просто interface{}, и вы не можете вызвать len на interface{}.

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