Отражение Тип сравнения - PullRequest
0 голосов
/ 12 ноября 2018

Я хочу убедиться, что тип map ключей string. Key() метод возвращает Type, и я не уверен, как правильно проверить, является ли он string. Единственное, что пришло мне в голову:

if v.Type().Key() == reflect.TypeOf("") {
    fmt.Print("It is string")
}

Это правильный путь?

Ответы [ 2 ]

0 голосов
/ 12 ноября 2018

Да, что вы сделали, если тип ключа «точно» string.

Но, например, если типом ключа будет пользовательский тип, имеющий string в качестве базового типа, как в этом примере:

type mystr string
m := map[mystr]int{}

Тогда тип ключа не будет равен reflect.TypeOf("").

Это зависит от вас, если это то, что вы хотите. Если вы также хотите принять вышеуказанные типы карт, вы можете проверить вид ключа, если он равен reflect.String, например:

if v.Type().Key() == reflect.TypeOf("") {
    fmt.Print("It is string")
}

if v.Type().Key().Kind() == reflect.String {
    fmt.Print("It is string kind")
}

Для вышеупомянутого map[mystr]int это вывод (попробуйте на Go Playground ):

It is string kind

(Ключ не относится к типу string, но имеет вид string.)

0 голосов
/ 12 ноября 2018

Вы можете извлечь Kind ключа и сопоставить его с добрыми перечислениями в пакете reflect, например reflect.String, например:

package main

import (
    "fmt"
    "reflect"
)

func main() {

    obj := make(map[string]interface{})

        fmt.Println(reflect.TypeOf(obj).Key().Kind() == reflect.String) // It will print true
}

Посмотрите этот Фрагмент Go Playground , если хотите попробовать.

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