Определите, является ли тип строкой, используя отражение

Некоторые из существующих здесь ответов о том, как определить тип объекта во время выполнения... Бог поможет нам

if reflect.TypeOf(err) ==  string {

}

это не компилируется

if reflect.TypeOf(err) ==  "string" {

}

ни то, ни это:

if reflect.TypeOf(err).Kind() ==  "string" {

}

как нам это сделать?

Если я использую функцию typeof, заданную одним из ответов, я получаю:

введите здесь описание изображения


person Community    schedule 20.12.2018    source источник
comment
Прочтите документацию по используемому вами пакету: golang.org/pkg/reflect TypeOf не возвращает строку, а также Kind.   -  person Adrian    schedule 20.12.2018


Ответы (2)


Сравнить как строку

if reflect.TypeOf(err).String() == "string" {
    fmt.Println("hello")
}

Или используя утверждения типа.

type F = func()

func typeof(v interface{}) string {
    switch v.(type) {
    case int:
        return "int"
    case string:
        return "string"
    case F:
        return "F"
    //... etc
    default:
        return "unknown"
    }
}

Затем

var f F
if typeof(f) == "F"{
    fmt.Println("hello F")
}
person KibGzr    schedule 20.12.2018
comment
хорошо, спасибо, а что, если это пользовательский тип? например, если у меня есть type F = func(), и я хочу увидеть, является ли TypeOf (ошибка) F? - person ; 20.12.2018
comment
спасибо, есть ли случай, когда v.(type) потерпит неудачу? - person ; 20.12.2018
comment
как я знаю, нет. - person KibGzr; 20.12.2018
comment
Полностью перейти на утверждения типа. в большинстве случаев использование отражения не делает вас умнее. Всегда используйте предоставленные языком конструкции, если можете. Это очень похоже на один из тех случаев - person DallaRosa; 20.12.2018
comment
Когда я опробовал эту технику, я получил довольно забавные вещи, думаю, я буду использовать утверждения типов. - person ; 20.12.2018
comment
Сравнение таких строк, как reflect.TypeOf(err).String() == "string", может иметь ложные срабатывания, поскольку Type.String() не гарантирует уникальность среди всех типов. - person Cerise Limón; 20.12.2018

Чтобы сравнить типы с помощью Reflect, сравните значения Reflect.Type:

var stringType = reflect.TypeOf("") // this can be declared at package-level

if reflect.TypeOf(v) == stringType {
    // v has type string
}

Учитывая произвольное имя типа X, вы можете построить тип, используя:

var xType = reflect.TypeOf((*X)(nil)).Elem()

if reflect.TypeOf(v) == xType {
    // v has type X
}

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

if _, ok := v.(string); ok {
   // v is a string
}

Если вы хотите сопоставить типы со строками, используйте карту с ключом Reflect.Type:

var typeName = map[reflect.Type]string{
    reflect.TypeOf((*int)(nil)).Elem():    "int",
    reflect.TypeOf((*string)(nil)).Elem(): "string",
    reflect.TypeOf((*F)(nil)).Elem():      "F",
}

...

if n, ok := typeName[reflect.TypeOf(f)]; ok {
    fmt.Println(n)
} else {
    fmt.Println("other")
}
person Cerise Limón    schedule 20.12.2018