概述

  • 面向对象
    • go语句仅支持分装,不支持4继承和多态。 面向接口编程
    • go语言没有class 只有struct
  • 指针接收者与针接收者的选择
    • 要改变内容必须使用指针接收者
    • 结构过大也考虑使用指针接收者
    • 一致性:如有指针接收者,最好都是指针接收者
  • 封装
    • 名字一般使用CamelCase
    • 首字母大写: public
    • 首字母小写: private
    • 每个目录一个包
    • main包包含执行入口
    • 为结构定义的方法必须放在同一个包内
    • 可以是不同的文件
  • 如何扩充系统类型或者别人的类型
    • 定义别名
    • 使用组合

代码

treeentry\entry.go

  1. package main
  2. import (
  3. "fmt"
  4. "golearn/tree"
  5. )
  6. type myTreeNode struct {
  7. node *tree.Node
  8. }
  9. func (myNode *myTreeNode) postOrder() {
  10. if myNode == nil || myNode.node == nil {
  11. return
  12. }
  13. left := myTreeNode{myNode.node.Left}
  14. right := myTreeNode{myNode.node.Right}
  15. left.postOrder()
  16. right.postOrder()
  17. myNode.node.Print()
  18. }
  19. func main() {
  20. var root tree.Node
  21. root = tree.Node{Value: 3}
  22. root.Left = &tree.Node{}
  23. root.Right = &tree.Node{5, nil, nil}
  24. root.Right.Left = new(tree.Node)
  25. root.Left.Right = tree.CreateNode(2)
  26. root.Right.Left.SetValue(4)
  27. fmt.Print("In-order traversal: ")
  28. root.Traverse()
  29. fmt.Print("My own post-order traversal: ")
  30. myRoot := myTreeNode{&root}
  31. myRoot.postOrder()
  32. fmt.Println()
  33. nodeCount := 0
  34. root.TraverseFunc(func(node *tree.Node) {
  35. nodeCount++
  36. })
  37. fmt.Println("Node count:", nodeCount)
  38. c := root.TraverseWithChannel()
  39. maxNodeValue := 0
  40. for node := range c {
  41. if node.Value > maxNodeValue {
  42. maxNodeValue = node.Value
  43. }
  44. }
  45. fmt.Println("Max node value:", maxNodeValue)
  46. }

node.go

  1. package tree
  2. import "fmt"
  3. type Node struct {
  4. Value int
  5. Left, Right *Node
  6. }
  7. func (node Node) Print() {
  8. fmt.Print(node.Value, " ")
  9. }
  10. func (node *Node) SetValue(value int) {
  11. if node == nil {
  12. fmt.Println("Setting Value to nil " +
  13. "node. Ignored.")
  14. return
  15. }
  16. node.Value = value
  17. }
  18. func CreateNode(value int) *Node {
  19. return &Node{Value: value}
  20. }

traversal.go

  1. package tree
  2. import "fmt"
  3. func (node *Node) Traverse() {
  4. node.TraverseFunc(func(n *Node) {
  5. n.Print()
  6. })
  7. fmt.Println()
  8. }
  9. func (node *Node) TraverseFunc(f func(*Node)) {
  10. if node == nil {
  11. return
  12. }
  13. node.Left.TraverseFunc(f)
  14. f(node)
  15. node.Right.TraverseFunc(f)
  16. }
  17. func (node *Node) TraverseWithChannel() chan *Node {
  18. out := make(chan *Node)
  19. go func() {
  20. node.TraverseFunc(func(node *Node) {
  21. out <- node
  22. })
  23. close(out)
  24. }()
  25. return out
  26. }

封装

  • 名字一般使用CamelCase
  • 首字母大写: public
  • 首字母小写: private

定义别名

  1. package queue
  2. // A FIFO queue.
  3. type Queue []int
  4. // Pushes the element into the queue.
  5. // e.g. q.Push(123)
  6. func (q *Queue) Push(v int) {
  7. *q = append(*q, v)
  8. }
  9. // Pops element from head.
  10. func (q *Queue) Pop() int {
  11. head := (*q)[0]
  12. *q = (*q)[1:]
  13. return head
  14. }
  15. // Returns if the queue is empty or not.
  16. func (q *Queue) IsEmpty() bool {
  17. return len(*q) == 0
  18. }
  1. package main
  2. import (
  3. "fmt"
  4. "golearn/queue"
  5. )
  6. func main() {
  7. q := queue.Queue{1}
  8. q.Push(2)
  9. q.Push(3)
  10. fmt.Println(q.Pop())
  11. fmt.Println(q.Pop())
  12. fmt.Println(q.IsEmpty())
  13. fmt.Println(q.Pop())
  14. fmt.Println(q.IsEmpty())
  15. }

image.jpeg