【问题标题】:invalid recursive type in a struct in gogo中结构中的无效递归类型
【发布时间】:2011-11-25 11:09:56
【问题描述】:

我是 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 类型的 var 创建一个新 Environment 时,它会收到错误“不能使用 fun_Val.ds (type Environment) 作为字段值中的 *Environment 类型”。我正在按如下方式创建环境:

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

我试图将这篇文章中的代码数量控制在一个限制范围内,但如果您需要更多代码或有其他问题,请告诉我。

【问题讨论】:

    标签: go


    【解决方案1】:

    您需要将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)}
    

    【讨论】:

    • "否则编译器无法判断 Environment 结构的大小。"那是错误的。编译器确切地知道 Environment 结构的大小是多少:它是无限的。编译器的这种知识是编译器拒绝代码并说“无效的递归类型环境”的原因。
    • @Atom,不是这样:Environment 结构的大小可能是无限的;当存在具有 null 父级的 Environment 时,链结束。正是出于这个原因,一些编译器,例如FPC,能够处理类似的定义。
    • @JasonFruit 只要您使用指针,它就只能为空。如果不是,那么它绝对就像在 OP 示例中一样,因为内部结构的空间必须作为外部结构空间的一部分分配。
    • 为什么@JasonFruit 的评论比@Atom 的评论有更多的支持?这是错的。 Golang 值类型不能为空,C++ 或 C 也不能。没有意义,因为值类型字段的内容直接存储在它使用的上下文中。所以是的,Golang 编译器知道它是无限的。当然,除非定义只是 type A struct {A} - 然后它是 0,但仍然无法编译,因为深度仍然是无限的。
    【解决方案2】:

    我希望这能解决问题:

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

    (& 是 Go 中的“地址”运算符。)

    【讨论】:

      猜你喜欢
      • 2016-07-04
      • 1970-01-01
      • 2013-06-09
      • 2019-01-28
      • 2018-05-11
      • 2017-03-07
      • 1970-01-01
      • 2017-12-21
      • 1970-01-01
      相关资源
      最近更新 更多