Неверный рекурсивный тип в структуре в go
Я новичок в языке программирования Go, и у меня есть назначение для создания и интерпретатора, но я столкнулся с следующей проблемой:
Я хочу определить среду как:
type Environment struct{
parent Environment
symbol string
value RCFAEValue
}
func (env Environment) lookup(lookupSymbol string) RCFAEValue{
if lookupSymbol == env.symbol{
return env.value
} //if parent != nill {
return env.parent.lookup(lookupSymbol)
}
Но я получаю сообщение об ошибке "Недействительный рекурсивный тип среды". Основываясь на моих исследованиях, я сменил родителя на тип * Environment. Но теперь, когда мне нужно создать новую среду с var типа Среда, она получит ошибку "не может использовать fun_Val.ds(type Environment) как тип * Environment in field value". Я создаю среду следующим образом:
Environment{fun_Val.ds,fun_Val.param,exp.arg_exp.interp(env)}
Я пытаюсь сохранить количество кода в этом сообщении до предела, но если вам нужно больше или у вас есть другие вопросы, сообщите мне.
Ответы
Ответ 1
Вам нужно определить Environment
как:
type Environment struct {
parent *Environment // note that this is now a pointer
symbol string
value RCFAEValue
}
В противном случае компилятор не имеет возможности выяснить, каков размер структуры среды. Размер указателя известен, но насколько велик тот, который содержит себя? (И внутренняя структура также содержит себя, как и внутренняя внутренняя структура и т.д.)
Создание среды будет выглядеть следующим образом:
Environment{&fun_Val.ds, fun_Val.param, exp.arg_exp.interp(env)}
Ответ 2
Я надеюсь, что это должно решить проблему:
Environment{&fun_Val.ds,fun_Val.param,exp.arg_exp.interp(env)}
(&
- это "адрес оператора" в Go.)