我正在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 接口以及如何定義實現它們的方法的更多信息:
- 1 回答
- 0 關注
- 99 瀏覽
添加回答
舉報
0/150
提交
取消