扩展已有类型
go没有继承,如果对别人的类型或系统类型扩展方法,两种方法
- 使用组合
- 定义别名
使用组合
package main
import (
"fmt"
"gin/tree"
)
type MyTreeNode struct {
node *tree.Node
}
func (myNode *MyTreeNode) postOrder() {
if myNode == nil || myNode.node == nil{
return
}
Left := MyTreeNode{myNode.node.Left}
Right := MyTreeNode{myNode.node.Right}
Left.postOrder()
Right.postOrder()
myNode.node.Print()
}
func main() {
var root tree.Node
root = tree.Node{Value:3}
root.Left = &tree.Node{} // 0
root.Right = &tree.Node{5,nil,nil}
root.Right.Left = new(tree.Node)
root.Right.Right = tree.CreateNode(23)
root.Traverse()
fmt.Println()
myRoot := MyTreeNode{&root}
myRoot.postOrder()
}
使用别名
queue.go
package queue
type Queue []int
func (q *Queue) Push(v int) {
*q = append(*q,v) //这里虽然传递的是一个地址 但是这样是可以改变其值的
}
func (q *Queue) Pop() int {
head := (*q)[0]
*q = (*q)[1:]
return head
}
func (q *Queue) IsEmpty() bool {
return len(*q) == 0
}
entry.go
package main
import (
"fmt"
"gin/queue"
)
func main() {
q := queue.Queue{1}
q.Push(2)
q.Push(3)
fmt.Println(q.Pop())
fmt.Println(q.Pop())
fmt.Println(q.IsEmpty())
fmt.Println(q.Pop())
fmt.Println(q.IsEmpty())
}