неверный рекурсивный тип в структуре в го - PullRequest
38 голосов
/ 24 ноября 2011

Я новичок в языке программирования 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".На основании моих исследований я сменил родителя на тип * Environment.Но теперь, когда мне нужно создать новую среду с переменным типом Environment, он получает сообщение об ошибке «не могу использовать fun_Val.ds (тип Environment) в качестве типа * Environment в значении поля».Я создаю среду следующим образом:

Environment{fun_Val.ds,fun_Val.param,exp.arg_exp.interp(env)}

Я пытаюсь ограничить количество кода в этом посте, но если вам нужно больше или у вас есть другие вопросы, пожалуйста, дайте мне знать.

Ответы [ 2 ]

56 голосов
/ 24 ноября 2011

Вам необходимо определить Environment как:

type Environment struct {
    parent *Environment // note that this is now a pointer
    symbol string
    value  RCFAEValue
}

В противном случае компилятор не сможет выяснить, каков размер структуры Environment. Размер указателя известен, но насколько велик тот, который содержит себя? (И внутренняя структура также содержит себя, как и внутренняя внутренняя структура и т. Д.)

Создание среды будет выглядеть следующим образом:

Environment{&fun_Val.ds, fun_Val.param, exp.arg_exp.interp(env)}
1 голос
/ 24 ноября 2011

Я надеюсь, что это должно решить проблему:

Environment{&fun_Val.ds,fun_Val.param,exp.arg_exp.interp(env)}

(& - это оператор 'address of' в Go.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...