猿问

如何创建扩展类型

我看到可以扩展导入的包,例如添加新方法。


但是,我尝试这样做来创建我自己的结构的新实例:


package main


import (

    "github.com/intdxdt/rtree"

)


type RTree struct {

    rtree.RTree

}


func NewRTree(nodeCap ...int) *RTree {

    return rtree.NewRTree(nodeCap...)

}

我在其他问题上看到了类似的例子。但是我得到一个错误:cannot use rtree.NewRTree(nodeCap...) (type *rtree.RTree) as type *RTree in return argument。


问题是——如何使用我自己的方法和所有导入的方法/字段初始化和使用我自己的结构?


皈依舞
浏览 65回答 1
1回答

翻过高山走不出你

永远记住,Go 不支持inheritance. 它支持composition.你可以call继承它,只要它能帮助你在其他 OOP 语言和 Go 之间进行逻辑映射。经验法则,只要某些东西不像它在OOP世界上的运作方式那样运作,就从构图的角度来思考。is a但是当涉及到编写实际代码时,请始终记住组合中没有任何关系,并且它始终是has a,即使看起来并非如此,因为事实上您实际上可以访问composed/embedded(still, not inherited)的成员变量和方法)结构。override如果您使用新结构声明相同的方法,您甚至可以使用该方法。这是另一个问题 - 您仍然无法访问protected另一个包中结构的未公开(接近 Java 世界)变量和函数,就像您的情况一样。但是,您的类型RTree has rtree.RTree, but 永远不会是 a rtree.RTree,并且对于编译器来说永远是不同的类型。package mainimport (    "github.com/intdxdt/rtree")type RTree struct {    rtree.RTree}func NewRTree(nodeCap ...int) *RTree {    return &RTree{        RTree: *rtree.NewRTree(nodeCap...),    }}在一个单独的节点上,除非你有更多的参数要添加,否则为什么不rtree.RTree直接使用呢?组合它,将为您提供封闭类型的所有方法,但您不能将它传递给任何需要封闭类型的函数。好消息是,您将隐式满足封闭类型所满足的接口,因此您可以将它传递给接受这些接口的函数。
随时随地看视频慕课网APP

相关分类

Go
我要回答