不太明白别名扩展
来源:4-3 扩展已有类型

五羊司机
2020-02-15
如果要用别名扩展的方式扩展结构体应该怎么做呢
例如,原本有一个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回答
-
别名扩展没有起到“扩展”的作用。别名扩展的确就是这样。如果我们不需要使用原来的方法,却要原来的数据,就可以这样用。另外,如果一个结构体里面只有一个字段而且不会增加,也可以考虑别名,比如:type Token string
内嵌vs组合。组合的写法并不绕,你觉得绕是因为你脑子里继承的想法过深。我们访问的每一个字段,都是"变量名.字段名.字段名",没有歧义。内嵌的话,访问的字段到底是谁的还需要有一定的Go语言基础才能理解。不过我这里的推荐也只是在差不多的情况下推荐组合。如果内嵌的写法能显著减少代码量,当然还是选择内嵌。
032020-04-26
相似问题