当有的功能需要在别人的基础上扩展时该怎么做呢?
比如一个java里面的类,我们可以继承它,然后再写我们自己的逻辑,但是go没有继承,我肯可以使用以下方法:
定义别名
使用组合
接着上次的代码,树的遍历,上次实现了中序遍历,这次实现后序遍历。
上次遍历的代码:
func (node *Node) Traverse() {
if node == nil{
return
}
node.LeftNode.Traverse()
node.Print()
node.RightNode.Traverse()
}
接下来就实现一下后序遍历:
type myNode struct {
node *tree.Node
}
func (node *myNode) postOrder() {
if node==nil || node.node==nil{
return
}
myNode{node.node.LeftNode}.postOrder()
myNode{node.node.RightNode}.postOrder()
node.node.Print()
}
定义了一个新的结构,叫做:myNode ,然后在myNode 中封装一个tree.Node,然后再给定义一个postOrder的方法,实现后序遍历,挺复杂的,需要理解一下这个关系。
然后是调用:
myNode{&root}.postOrder()
控制台输出:
# tree/entry
.\entry.go:16:28: cannot call pointer method on myNode literal
.\entry.go:16:28: cannot take the address of myNode literal
.\entry.go:17:29: cannot call pointer method on myNode literal
.\entry.go:17:29: cannot take the address of myNode literal
.\entry.go:36:15: cannot call pointer method on myNode literal
.\entry.go:36:15: cannot take the address of myNode literal
Compilation finished with exit code 2
控制台报错了,大概意思就是:无法在myNode上调用指针方法,因为我们是这样写的:
myNode{node.node.LeftNode}.postOrder()
没有定义一个新的变量来接收它,编译器可能就找不到地址,修改一下写法:
func (node *myNode) postOrder() {
if node==nil || node.node==nil{
return
}
left:=myNode{node.node.LeftNode}
left.postOrder()
right:=myNode{node.node.RightNode}
right.postOrder()
node.node.Print()
}
调用:
m:=myNode{&root}
m.postOrder()
控制台:
nodeValue: 2
nodeValue: 0
nodeValue: 4
nodeValue: 5
nodeValue: 3
这样就好了。
使用组合:
package quene
type Quene []int
func (q *Quene) Push(v int) {
*q = append(*q,v)
}
func (q *Quene) Pop() int {
head:=(*q)[0]
*q=(*q)[1:]
return head
}
func (q *Quene)IsEmpty() bool {
return len(*q)==0
}
通过slice实现一个队列,并且添加Push(),Pop(),IsEmpty(),三个方法。
func main() {
q:=quene.Quene{1}
q.Push(2)
q.Push(3)
fmt.Println(q.Pop())
fmt.Println(q.IsEmpty())
fmt.Println(q.Pop())
fmt.Println(q.Pop())
fmt.Println(q.IsEmpty())
}
控制台:
1
false
2
3
true
Process finished with exit code 0