包管理
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