为了账号安全,请及时绑定邮箱和手机立即绑定

如何创建扩展类型

如何创建扩展类型

Go
皈依舞 2023-04-04 17:07:11
我看到可以扩展导入的包,例如添加新方法。但是,我尝试这样做来创建我自己的结构的新实例:package mainimport (    "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。问题是——如何使用我自己的方法和所有导入的方法/字段初始化和使用我自己的结构?
查看完整描述

1 回答

?
翻过高山走不出你

TA贡献1875条经验 获得超3个赞

永远记住,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 main


import (

    "github.com/intdxdt/rtree"

)


type RTree struct {

    rtree.RTree

}


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

    return &RTree{

        RTree: *rtree.NewRTree(nodeCap...),

    }

}

在一个单独的节点上,除非你有更多的参数要添加,否则为什么不rtree.RTree直接使用呢?组合它,将为您提供封闭类型的所有方法,但您不能将它传递给任何需要封闭类型的函数。好消息是,您将隐式满足封闭类型所满足的接口,因此您可以将它传递给接受这些接口的函数。


查看完整回答
反对 回复 2023-04-04
  • 1 回答
  • 0 关注
  • 64 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信