【问题标题】:Confusion with interfaces与接口混淆
【发布时间】:2021-09-20 13:15:15
【问题描述】:

我正在用 Go 编写一个解析器,并且我有以下用于 ast 构造的代码:


type NODE interface {
    GetPosition() (int, int)
}

type EXPRESSION_NODE interface {
    NODE
    expressionNode()
}


// binary node
type BINARY_EXPRESSION struct {
    Operator    string
    Left, Right EXPRESSION_NODE
    Position
}

// implementing the EXPRESSION_NODE interface for BINARY_EXPRESSION
func (s BINARY_EXPRESSION) expressionNode()
func (s BINARY_EXPRESSION) GetPosition() (int, int) { return s.Line, s.Column }

所以我有一个接口 EXPRESSION_NODE 和 BINARY_EXPRESSION 结构,该结构实现了所有接口方法

这是我的困惑:

func (self *Parser) ParseBinaryExpression(
    operators []string,
    parser ExpressionParser,
) (*EXPRESSION_NODE, error) {
    self.SetPosition()
    result, err := parser()
    if err != nil {
        return nil, ChainErrs(self.Err(BINARY_EXPRESSION_ERROR), err)
    }
    for Includes(operators, self.stream.Peek().Literal) {
        operator := self.stream.Next().Literal
        right, err := parser()
        if err != nil {
            return nil, ChainErrs(self.Err(BINARY_EXPRESSION_ERROR), err)
            //ERROR: cannot use &(BINARY_EXPRESSION literal) (value of type *BINARY_EXPRESSION) as *EXPRESSION_NODE value in assignment
            result = &BINARY_EXPRESSION{operator, result, right, self.position}
        }
    }
    return result, nil
}

所以这一行

result = &BINARY_EXPRESSION{operator, result, right, self.position}

给我以下错误:cannot use &(BINARY_EXPRESSION literal) (value of type *BINARY_EXPRESSION) as *EXPRESSION_NODE value in assignment

所以当我这样做时

var a EXPRESSION_NODE = &BINARY_EXPRESSION{} 

没有指针一切似乎都很好,但是有了指针...... 问题是我实际上需要从我的函数中返回 *EXPRESSION_NODE

【问题讨论】:

  • 为什么你认为你需要返回一个指向接口的指针?
  • 因为我所有的 ast 节点都包含指向其子节点的指针
  • 这并没有解释指向接口的指针应该做什么。通常没有理由存储指向接口的指针,接口内的指针就足够了。

标签: go pointers struct types interface


【解决方案1】:

[您问题中的代码是部分的,因此以下是一个草图,并非完整的工作代码]

通常,您几乎可以肯定永远不想使用指向接口的指针。相反,您想要的是指向您的类型的指针以实现接口。

首先,确保指向你的类型的指针实现了接口:

type BINARY_EXPRESSION struct {
    Operator    string
    Left, Right EXPRESSION_NODE
    Position
}

// Note that pointer receivers
func (s *BINARY_EXPRESSION) expressionNode()
func (s *BINARY_EXPRESSION) GetPosition() (int, int) { return s.Line, s.Column }

然后你的解析函数会是这样的:

func (self *Parser) ParseBinaryExpression(
    operators []string,
    parser ExpressionParser,
) (EXPRESSION_NODE, error) {
    // ... stuff ...
    result = &BINARY_EXPRESSION{operator, result, right, self.position}
    return result, nil
}

我建议您详细了解 Go 接口以及如何定义实现它们的方法:

【讨论】:

    猜你喜欢
    • 2016-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-22
    • 1970-01-01
    • 1970-01-01
    • 2015-04-28
    • 1970-01-01
    相关资源
    最近更新 更多