struct.go 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. /*
  2. * @description:struct相关知识
  3. * @Author: CP
  4. * @Date: 2020-08-21 09:34:47
  5. * @FilePath: \construction_management\learn\struct.go
  6. */
  7. package learn
  8. import (
  9. "fmt"
  10. )
  11. /*
  12. 没有class,只有struct结构体
  13. 没有构造函数,可以加工厂函数来构造
  14. 结构体过大也考虑使用指针接收者
  15. 结构体的方法的封装
  16. 首字母大写:public
  17. 首字母小写:private 只是针对包
  18. 包
  19. 每个目录一个包,为结构体定义的方法必须在同一个包内
  20. 结构体的方法可以分散在不同的文件内,同一个包内
  21. 扩展其他人写的包-学习go语言4-3
  22. */
  23. type TreeNode struct {
  24. Value int
  25. // *类型是指针
  26. Left, Right *TreeNode
  27. }
  28. //为结构定义方法-方法名称前 定义好 (node treeNode)
  29. //显示定义和命名方法接收者
  30. func (node TreeNode) Print() {
  31. fmt.Println(node.Value)
  32. }
  33. //这里不使用指针是改不掉里面的值 node treeNode,需要指针
  34. //只有使用指针才可以改变结构内容 nil指针也能调用方法
  35. func (node *TreeNode) SetValue(value int) {
  36. node.Value = value
  37. }
  38. //遍历结构体treeNode
  39. func (node *TreeNode) Traveres() {
  40. if node == nil {
  41. return
  42. }
  43. //如果在其他语言node.left是nil调用traveres()会挂掉,在go语言中不会
  44. node.Left.Traveres()
  45. node.Print()
  46. node.Left.Traveres()
  47. node.Print()
  48. }
  49. //工厂函数来构造treeNode
  50. func CreateTreeNode(value int) *TreeNode {
  51. return &TreeNode{Value: value}
  52. }
  53. // func main() {
  54. // // 创建结构的方式1
  55. // var root2 treeNode
  56. // fmt.Println(root2)
  57. // // 创建结构的方式2
  58. // root := treeNode{value: 3}
  59. // //&取地址
  60. // root.left = &treeNode{}
  61. // // 创建结构的方式3
  62. // root.left.right = new(treeNode)
  63. // // 创建结构的方式4
  64. // root.left.left = createTreeNode(2)
  65. // // 创建结构的方式5
  66. // node := []treeNode{
  67. // {value: 3},
  68. // {},
  69. // {6, nil, nil},
  70. // }
  71. // fmt.Println(node)
  72. // //调用结构体方法
  73. // root.print()
  74. // root.right.left.setValue(2)
  75. // root.right.left.print()
  76. // root.traveres()
  77. // }