扩展已有类型

扩展已有类型

go没有继承,如果对别人的类型或系统类型扩展方法,两种方法

  1. 使用组合
  2. 定义别名

使用组合

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

原文地址:https://www.cnblogs.com/webclz/p/14019250.html