【发布时间】: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