亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

與接口混淆

與接口混淆

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 關注
  • 99 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號