请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

不太明白别名扩展

如果要用别名扩展的方式扩展结构体应该怎么做呢
例如,原本有一个treeNode结构体,有Print方法

type treeNode struct{
left, right *treeNode
value int
}

func (node *treeNode) Print(){
fmt.Println(node.value)
}

如果我想扩展这个结构体,给它添加setValue方法,使用别名的方式,那么,我新建一个NewNode结构体,作为treeNode的别名,并添加setValue方法

type NewNode treeNode

func (node *NewNode) setValue(value int){
if node == nil{
return
}
node.value = value
}

然后在main方法中调用:
var new_node NewNode
new_node.setValue(5)
可以调用成功

但是new_node却不能调用treeNode的Print方法了:
new_node.Print()
报错:new_node.Print undefined (type NewNode has no field or method Print)

只能将new_node强转回treeNode类型:
node := treeNode(new_node)
node.Print()

这样我觉得并没有起到扩展的作用呢,不知道是不是我写得不对

另外,为什么我觉得使用内嵌的方式明显比使用组合的方式更简单和合理呢,我感觉内嵌的方式看起来就和继承是一样的(尽管原理不同),而组合的方式太绕了很容易出错,为什么老师推荐使用组合的方式呢

谢谢老师

正在回答

1回答

  1. 别名扩展没有起到“扩展”的作用。别名扩展的确就是这样。如果我们不需要使用原来的方法,却要原来的数据,就可以这样用。另外,如果一个结构体里面只有一个字段而且不会增加,也可以考虑别名,比如:type Token string

  2. 内嵌vs组合。组合的写法并不绕,你觉得绕是因为你脑子里继承的想法过深。我们访问的每一个字段,都是"变量名.字段名.字段名",没有歧义。内嵌的话,访问的字段到底是谁的还需要有一定的Go语言基础才能理解。不过我这里的推荐也只是在差不多的情况下推荐组合。如果内嵌的写法能显著减少代码量,当然还是选择内嵌。

0 回复 有任何疑惑可以回复我~
  • 提问者 五羊司机 #1
    谢谢老师
    回复 有任何疑惑可以回复我~ 2020-02-17 14:56:06
  • 还是无法理解,比如别人写了一个queue的包,用来实现一些队列操作的方法,那我有一天发现我有个功能是这个包无法实现的,我想扩展它,用内嵌的方式写多一个方法去扩展,然后将这个过程封装成myQueue的包,以后别人用我的myQueue这个包,就可以用到原来queue包无法实现的功能,这才叫扩展吧。我看老师的例子,是我自己新写了一个queue的包,然后我用自己写的queue包来操作,这怎么叫扩展呢,也只是我自己造了一个叫queue轮子
    回复 有任何疑惑可以回复我~ 2020-04-25 23:53:14
  • ccmouse 回复 椰子树 #3
    queue的确不算这种程度的扩展。演示了应用别名来实现一个自定义类型。
    那个TreeNode 和 myTreeNode是扩展
    回复 有任何疑惑可以回复我~ 2020-04-26 20:44:38
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信