Подтвердить что ты не робот

Неверный рекурсивный тип в структуре в 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)}

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

4b9b3361

Ответ 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.)