• 初识Golang的面向对象 为结构体(类)绑定方法


    前言

    Go语言面向对象
    Go语言仅支持封装 不支持继承和多态
    继承和多态通过接口实现 

    成员函数的实现 

    创建类对象在Go语言中表现为创建一个结构体变量

            可以定义一个工厂函数 专门负责初始化结构体(类)变量

            类似于C++的构造函数

    Go语言支持返回局部变量的地址

             Go语言编译器会自动决定是否分配到内存堆区

    为结构体定义方法(C++中的成员函数)
            在函数名(代码示例中是print)之前指出函数的接收者

            函数的接收者是一个额外的参数

            指明该函数属于哪一个结构体(类)的方法
            如果是值接收者

            拷贝一个结构体(类)变量(代码示例中是treeNode)给函数

            如果涉及修改结构体(类)变量中的成员值

            则必须使用指针接收者 (代码示例中是*treeNode

            指针接收者 会把treeNode底层地址给函数


            Go语言中的 . 可以解释为C++的 ->
            此外 结构体过大也要考虑使用指针接收者 减少拷贝变量对资源的消耗 

    中序遍历二叉树的小应用 

    用Go语言实现二叉树的中序遍历

    在Go语言中 nil指针也可以调用方法(与C++显著不同)

    代码演示+详细注释 

    1. package main
    2. import "fmt"
    3. //Go语言面向对象
    4. //Go语言仅支持封装 不支持继承和多态
    5. //继承和多态通过接口实现
    6. type treeNode struct {
    7. value int
    8. left, right *treeNode
    9. }
    10. //工厂函数 可以创建类对象
    11. //Go语言支持返回局部变量的地址 往往会自动分配到内存堆区
    12. func createNode(value int) *treeNode {
    13. return &treeNode{value: value}
    14. }
    15. //为结构体定义方法
    16. //在函数名print之前指出接收者 作为额外的一个参数
    17. //值接收者 会拷贝一个treeNode给函数
    18. func (node treeNode) print() {
    19. fmt.Println(node.value)
    20. }
    21. //修改值必须带星
    22. //Go语言中的 . 可以解释为C++的 ->
    23. //指针接收者 会把treeNode底层地址给函数
    24. //结构体过大也要考虑使用指针接收者
    25. func (node *treeNode) setValue(value int) {
    26. if node == nil {
    27. fmt.Println("Setting value to nil")
    28. return
    29. }
    30. node.value = value
    31. }
    32. //中序遍历二叉树
    33. func (node *treeNode) traverse() {
    34. if node == nil {
    35. return
    36. }
    37. node.left.traverse()
    38. node.print()
    39. node.right.traverse()
    40. }
    41. func main() {
    42. var root treeNode
    43. root = treeNode{value: 3}
    44. root.left = createNode(2)
    45. root.right = &treeNode{5, nil, nil}
    46. root.right.left = new(treeNode)
    47. nodes := []treeNode{
    48. {value: 3},
    49. {},
    50. {6, nil, &root},
    51. }
    52. fmt.Println(nodes)
    53. root.print()
    54. root.setValue(999)
    55. root.print()
    56. //Go语言中nil指针也可以调用方法(和C++显著不同)
    57. var pRoot *treeNode = nil
    58. pRoot.setValue(10)
    59. //中序遍历
    60. root.traverse()
    61. }

    运行效果展示 

     

  • 相关阅读:
    软件测试工程师面试基础题(应届生和测试小菜必备)最基础的面试题
    Java中的集合类
    渲染如何做到超强渲染?MAX插件CG MAGIC中的渲染功能!
    uni-app中添加路由拦截
    字节跳动软件测试岗,前两面过了,第三面HR天坑,结局透心凉...
    Java9新增特性
    Opencv实现目标检测
    【C++笔试强训】第十九天
    技术改变了什么?
    pip install 超时中断处理
  • 原文地址:https://blog.csdn.net/u014285914/article/details/126119963