为了账号安全,请及时绑定邮箱和手机立即绑定

与接口混淆

与接口混淆

Go
烙印99 2022-09-12 20:20:16
我正在Go中编写一个解析器,并且我有以下用于ast构造的代码:type NODE interface {    GetPosition() (int, int)}type EXPRESSION_NODE interface {    NODE    expressionNode()}// binary nodetype BINARY_EXPRESSION struct {    Operator    string    Left, Right EXPRESSION_NODE    Position}// implementing the EXPRESSION_NODE interface for BINARY_EXPRESSIONfunc (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
查看完整描述

1 回答

?
慕雪6442864

TA贡献1812条经验 获得超5个赞

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


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


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 接口以及如何定义实现它们的方法的更多信息:


查看完整回答
反对 回复 2022-09-12
  • 1 回答
  • 0 关注
  • 80 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信