go中的结构中的无效递归类型

时间:2011-11-24 18:03:46

标签: 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(类型环境)作为类型*环境中的字段值”。我正在创建环境如下:

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

我正在尝试将此帖子中的代码数量限制在一个限制内,但如果您需要更多或有其他问题,请告知我们。

2 个答案:

答案 0 :(得分:55)

您需要将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 :(得分:1)

我希望这可以解决问题:

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

&是Go中的'地址'运算符。)