2015-10-13 3 views
-2

Например, у меня есть interface{} по имени a, а также у меня есть reflect.Type под названием elemType. Теперь я хочу напечатать assert a до elemType, но a.(elemType) невозможно скомпилировать. Как это исправить?В golang, как напечатать assert interface {} до типа, указанного отражением.

Извините за мое запутанное выражение. Мое значение в том, что я получаю тип от функции, и я хочу напечатать assert interface {} для этого типа, но этот тип хранится в переменной reflect.Type.

То, что я хочу сделать, это похоже на код ниже:

var a interface{} 

//do something 

func getType() reflect.Type { 
    var ret reflect.Type 
    //do something 
    return ret 
} 

targetType := getType() 
result := a.(targetType) 
+4

elemType не является типом, это var, поэтому это утверждение типа не может работать. Вы можете сделать утверждение типа для 'reflect.Type', но почему-то я сомневаюсь, что это то, что вы хотите сделать. Покажите нам какой-нибудь код? – HectorJ

+1

Puh, empty 'interface {}' _and_ type assertion to' reflect.Type'! Вы уверены, что вы a) должны и b) должны решить вашу проблему следующим образом? Иногда размышление - лучший способ сделать что-то, иногда пустой интерфейс полезен, но оба они не являются самым простым способом решения проблем. – Volker

ответ

1

Рассмотрим стандартный тип утверждения в Go:

v := a.(typeName) 

Здесь компилятор может определить тип переменной v в компилировать время и использовать эти знания при компиляции любых дальнейших операторов, связанных с переменной.

В вашем примере использования переменной refltect.Type в утверждении было бы невозможно определить тип v, поэтому код не может быть скомпилирован.

Если вам нужно проверить, что определенная переменная интерфейса имеет определенный тип во время выполнения, вы все равно можете сделать это с помощью пакета reflect. Например:

// if elemType is a normal type 
if reflect.ValueOf(a).Type() == elemType { 
    fmt.Println("type matches") 
} 

// if elemType is an interface, can check if the value implements it 
if reflect.ValueOf(a).Type().Implements(elemType) { 
    fmt.Println("value implements interface") 
} 

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

Смежные вопросы