Go语言学习之——扩展已有类型

如何扩充系统类型或者别人的类型:

  • 定义别名
  • 使用组合

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())
}

你可能感兴趣的:(Go语言学习之——扩展已有类型)