Как явно ввести тип в Go?

# #go #types #casting

Вопрос:

У меня есть статически объявленная переменная

var fun *ast.FunDecl

и массив с именем decl tyle ast.Decl , содержащий элементы разных типов ast.GenDecl и *ast.FunDecl .

Теперь, во время выполнения, я хотел бы выполнить итерацию по массиву и присвоить моей переменной первый встречающийся элемент типа *ast.FunDecl fun .

В рамках моей итерации массива, где d находится текущий элемент массива, я использую:

 switch t := d.(type)
{
    case *ast.FunDecl:
    {
        fun = d // cannot use d (variable of type ast.Decl) as *ast.FuncDecl value in assignment
    }

    // more type cases ...
}
 

Кроме того, пытаясь использовать явный бросок

 fun = *ast.FunDecl(d)
 

паникует, говоря:

не удается преобразовать d (переменную типа ast.Decl) в ast.FuncDecl.

Помимо решения этой конкретной ситуации, это подводит меня к общему вопросу: как справиться с подобной ситуацией с подбором типов? Как я могу привести переменную к определенному типу, если я знаю, что ее тип соответствует моему приведению?

Комментарии:

1.1. В Go нет приведений типов. 2. func = t работает так, как t имеет тип *ast.FunDecl внутри этого case . 3. Переключатели типа покрыты tour.golang.org/methods/16 . 4. Утверждения типа не являются слепками с ленты и описываются в tour.golang.org/methods/15

Ответ №1:

вам нужно назначить приведенное значение типа t вместо d

 switch t := d.(type){
    case *ast.FunDecl:
    {
        fun = t
    }
}
 

Комментарии:

1. Повелитель пиццы, пожалуйста, дайте мне информацию о вашем банковском счете, я хотел бы отправить вам все деньги, которые у меня есть! Серьезно, я думаю, что никогда бы не пришел к этому супер-легкому и супер-простому выводу. Это работает как заклинание! @Volker: Смотрите и учитесь, как быть полезным!

2. @marcwellman я рад, что мой ответ помог вам