如何扩充系统类型或者别人的类型:
- 定义别名
- 使用组合
1、组合
例如对已有的package tree进行扩展,以下是其内容
package tree
import "fmt"
type Node struct {
Value int
Left, Right *Node
}
func (node Node) Print() {
fmt.Println(node.Value)
}
func (node Node) SetValue( value int ) {
node.Value = value
}
func (node *Node) RealSetValue( value int ) {
node.Value = value
}
func CreateNode( value int ) *Node {
return &Node{Value:value}
}
func (node *Node) Traverse() {
if node == nil {
return
}
node.Left.Traverse()
node.Print()
node.Right.Traverse()
}
main中,对其进行扩展,实现后序遍历操作
package main
import (
"learngo/tree"
)
type myTreeNode struct {
node *tree.Node
} // 新建一个struct,包含以前的
func (myNode *myTreeNode) postOder(){
// 因为有可能把nil包进myTreeNode中,所以需要判断myNode.node == nil
if myNode == nil || myNode.node == nil {
return
}
// 这里是新建一个myTreeNode类型的结构体,myNode.node.Left是个指针
left := myTreeNode{myNode.node.Left}
left.postOder()
right := myTreeNode{myNode.node.Right}
right.postOder()
myNode.node.Print()
}
func main() {
var root tree.Node
root = tree.Node{Value:3}
root.Left = &tree.Node{}
root.Right = &tree.Node{5, nil, nil }
root.Right.Left = new(tree.Node)
root.Left.Right = tree.CreateNode(8)
root.Left.RealSetValue(7)
pRoot := &root
pRoot.RealSetValue(20)
// 这里是新建一个myTreeNode类型的结构体,root并不是指针,所以要取地址
myRoot := myTreeNode{&root}
myRoot.postOder() // output: 8 7 0 5 20
}
2、定义别名
定义一个新的类型Queue,相当于对系统的[]int进行了扩展,为其新增了几种方法
package queue
// 定义了新类型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
}
对Queue类型的使用:
package main
import (
"learngo/queue"
"fmt"
)
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())
}