gpt4 book ai didi

go - 在 golang 中表示通用数据类型的惯用方式

转载 作者:行者123 更新时间:2023-12-03 03:14:26 24 4
gpt4 key购买 nike

在 AST 的特定实现中,我有一个作为接口(interface)的 node 以及 ExprNodeEvalNode 和一些叶节点。现在叶子节点可以是字符串节点或数字节点或函数节点每个表达式节点只能有两个叶节点。左边一个,右边一个。

type Node interface{
Pos() int64
Typ() NodeType
}

type StringNode struct{
Pos int64
Val string
Node
}

type NumberNode struct {
Pos int64
Val float64
Node
}

type ExprNode struct {
Lhs ??? //should accept either StringNode or NumberNode
Op Operation
Rhs ??? //should accept either StringNode or NumberNode
Node
}

type EvalNode struct{
Lhs *ExprNode
AllFlag bool
Rhs *ExprNode
Node
}

我想出了一个可能不惯用的解决方法。我正在寻找是否有更好的方法来做到这一点

type LeafNode interface{
IsLeaf() bool
}

func (n *StringNode) IsLeaf() bool{
return true
}

func (n *NumberNode) IsLeaf() bool{
return true
}

type ExprNode struct {
Lhs LeafNode //workaround
Op Operation
Rhs LeafNode //workaround
Node
}

现在,在上面的解决方法中,IsLeaf() 函数对我来说没有任何意义,但我必须使用它来限制 ExprNode 上接受的节点类型。

如果标题看起来过于宽泛,我们深表歉意。

问题:是否有更好的方法来对上述场景进行编程。

注意:我只是在寻找处理上述场景的惯用方法,而不是寻找算法的替代实现。

最佳答案

使用以下类型确保只有叶子类型可以分配给 ExprNode.Lhs 和 Exprnode.Rhs:

type Node interface{
Pos() int64
Typ() NodeType
}

type LeafNode interface {
Node
Leaf() // sentinel function to distinguish leaf types from other types
}

func (*NumberNode) Leaf() {}
func (*StringNode) Leaf() {}

type ExprNode struct {
Lhs LeafNode
Op Operation
Rhs LeafNode
Node
}

关于go - 在 golang 中表示通用数据类型的惯用方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58475288/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com