# #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 я рад, что мой ответ помог вам