包管理

javapythongo
import (
	"golearn/lesson8/tree"
	"fmt"
	"golearn/lesson8/queue"
)
fmtgogogopublic
package tree

import "fmt"

type Node struct {
	Value       int
	Left, Right *Node
}

func (node Node) Print() {
	fmt.Println(node.Value)
}

func CreateNode(value int) *Node {
	// go 里不需要关心变量是在堆上创建还是栈上创建的
	return &Node{Value: value}
}

func (node *Node) SetValue(value int) {
	node.Value = value
}

func (node *Node) Traverse() {
	if node == nil {
		return
	}
	// 其他语言需要判断 null,go 不用
	node.Left.Traverse()
	node.Print()
	node.Right.Traverse()
}

这是之前的代码,现在把方法名和变量名全都首字母大写

idea 里装上UpperLowerCapitalize插件后
Alt+P // to uppercase
Alt+L // to lowercase
Alt+C // 首字母大写

tree.gotreeMyTreeNodemain

这里有个小插曲,我本来这个包叫 lesson8-package,发现引入后怎么都是报错,才发现,包名不能带-号

之前的中序遍历是这样的

func main() {
	var root tree.Node
	root = tree.Node{Value: 3}           // root->3
	root.Left = &tree.Node{}             // left->0
	root.Right = &tree.Node{5, nil, nil} // right->5
	root.Right.Left = new(tree.Node)     // right->left->0
	root.Left.Right = tree.CreateNode(2) // left->right->2
	root.Right.Left.SetValue(4)
	// 0->2->3->4->5
	root.Traverse()
}

go
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()
}
MyTreeNodeMyTreeNodefunc (结构体指针) 方法名([参数])[返回值]左右中
fmt.Println("后序遍历")
myRoot := MyTreeNode{&root}
myRoot.postOrder()
// 2 0 4 5 3

扩展

我想把之前的数组的 push 和 pop 封装一下
和二叉树一样,单独放在一个包里

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 {
	if len(*q) == 0 {
		return true
	} else {
		return false
	}
}

package main

import (
	"golearn/lesson8/tree"
	"fmt"
	"golearn/lesson8/queue"
)

func  main(){
    s := queue.Queue{1, 3, 5, 7, 9}
    s.Push(11)
    fmt.Println(s)
    for !s.IsEmpty() {
    	s.Pop()
    	fmt.Println(s)
    }

}

总结

public