java如果要实现扩展已有类型的话,可以进行继承,但是继承真正做起来会很不灵活,go语言中就直接取消掉了继承;go语言对扩展已有类型提供了定义别名和使用组合
使用组合
代码中的Traverse函数是对Node进行遍历;但是遍历方式是左->中->右;如果我们需要左->右->中就需要自己进行扩展
package main
import (
"awesomeProject/tree"
"fmt"
)
type myNode struct {
node *tree.Node
}
func (node *myNode) postOrder() {
if node == nil || node.node == nil {
return
}
left := myNode{node.node.Left}
left.postOrder()
right := myNode{node.node.Right}
right.postOrder()
node.node.Print()
}
func main() {
var root tree.Node
root = tree.Node{Value: 3}
root.Left = &tree.Node{}
root.Right = &tree.Node{Value: 5}
root.Right.Left = new(tree.Node)
root.Left.Right = tree.CreateNode(2)
root.Right.Left.SetValue(4)
// 0 2 3 4 5
root.Traverse()
fmt.Println()
// 2 0 4 5 3
myRoot := myNode{node: &root}
myRoot.postOrder()
}
定义别名
package queue
type Queue []int
func (queue *Queue) Push(val int) {
*queue = append(*queue, val)
}
func (queue *Queue) Pop() int {
popVal := (*queue)[0]
*queue = (*queue)[1:]
return popVal
}
func (queue *Queue) IsEmpty() bool {
return len(*queue) == 0
}
package main
import (
"awesomeProject/queue"
"fmt"
)
func main() {
q := queue.Queue{1}
q.Push(2)
q.Push(3)
fmt.Println(q) // [1 2 3]
fmt.Println(q.Pop()) // 1
fmt.Println(q.Pop()) // 2
fmt.Println(q.IsEmpty()) // false
fmt.Println(q) // [3]
fmt.Println(q.Pop()) // 3
fmt.Println(q.IsEmpty()) // true
fmt.Println(q) // []
}