面向对象,有封装、继承、多态三大特性,而C++支持多继承,ruby为防止混乱不支持多继承而采用mixin的,C#则支持单继承并且推荐使用接口。可见各种语言的设计者对于OOP的理解各有不同,而go语言仅仅保存了面向对象的封装,不支持继承和多态,秉承了简介的设计理念。

本篇将会通过实现一个树来介绍go语言所谓的“面向对象的用法”:

定义结构体:

type treeNode struct {value   intleft, right *treeNode
}

如上所示,我们定义了一个包含一个int成员和左右两个结点的树结构体。

实例化:

func main(){//初始化方式1:{0 <nil> <nil>}var root treeNoderoot = treeNode{value:3}root.left = &treeNode{}root.right = &treeNode{5,nil,nil}root.right.left = new(treeNode)nodes := []treeNode{{value:3},{},{6,nil,&root},}fmt.Println(nodes)
}

与C++语言不同,无论是地址还是结构本身,都使用.来访问成员。

go语言没有构造函数,但如果想控制结构体的构造,我们可以使用工厂函数。而工厂函数在go语言中不过是普通的函数。

添加工厂函数:

func createNode(value int) *treeNode{return &treeNode{value: value}
}
  • 使用了自定义工厂函数
  • 注意:返回了局部变量的地址!

结构创建在哪里?

在C++中,局部变量分配在栈上,通过new的则分配在堆上。而Java中,都分配在堆上,靠垃圾回收机制。

而go语言分配在哪?

不需要知道:

如果函数取得地址并返回给别人用,则程序会分配在堆上。否则很有可能会被分配在栈上。

为结构体定义方法:

在Go语言中,方法不写在结构体中。为此,我们需要在定义函数时,在函数名前写一个接收者(这也是个值传递)

func (node treeNode) print(){fmt.Println(node.value)
}

于是可以这样调用函数:

root.print()
由于Go语言中的参数传递都是值传递,因此如果需要修改结构体的值,则需要传递一个指针:
func (node *treeNode) setValue(value int){node.value = value
}

编译器可以智能地获取指针或者值,但如果不用指针,只能是值传递。

nil指针也能调用方法。

添加遍历函数:

func (node *treeNode) traverse(){if node == nil{return}node.left.traverse()node.print()node.right.traverse()
}

使用中序遍历,实现遍历函数。

打印结果为0,2,3,4,5

Go语言攻略:“面向对象”相关推荐

  1. C语言攻略指南(三)流程控制篇

    流程控制语句,或者说控制流语句,是用于控制程序计算操作执行的次序,使我们能实现判断,选择,循环等操作.本篇将逐一描述 C语言中的流程控制语句. 语句与语句块 简单语句 表达式; 表达式或是变量申明,赋 ...

  2. 【C语言攻略】详解函数和函数递归

    本章目录 编程环境 函数是什么? 函数分类 库函数 strlen函数 strcpy函数 memset函数 自定义函数 函数的形参与实参 函数的嵌套调用和链式访问 函数的声明与定义 函数递归 编程环境 ...

  3. C语言攻略指南(五)数组篇

    数组是指那些具有相同的数据类型的,数量有限的若干个变量通过有序的方法组织起来的一样种便于使用的形式.数组属于派生类型(数组是建立在其他类型的基础上),数组中的变量被称为数组的元素. 一维数组 一维数组 ...

  4. Python:Python语言的简介(语言特点/pyc介绍/Python版本语言兼容问题(python2 VS Python3))、安装、学习路线(数据分析/机器学习/网页爬等编程案例分析)之详细攻略

    Python:Python语言的简介(语言特点/pyc介绍/Python版本语言兼容问题(python2 VS Python3)).安装.学习路线(数据分析/机器学习/网页爬等编程案例分析)之详细攻略 ...

  5. Python语言的简介(语言特点/pyc介绍/Python版本语言兼容问题(python2 VS Python3))、安装、学习路线(数据分析/机器学习/网页爬等编程案例分析)之详细攻略

    目录 Python语言的简介 1.Python的应用领域 2.Python语言特点.对比其它语言 2.1.Python语言特点 2.2.Python语言对比其它语言 3.Python版本语言兼容问题( ...

  6. opencv3计算机视觉python语言实现pdf_对比《OpenCV计算机视觉编程攻略第3版》《OpenCV 3计算机视觉Python语言实现第2版》PDF代码......

    OpenCV 3是一种先进的计算机视觉库,可以用于各种图像和视频处理操作,通过OpenCV 3 能很容易地实现一些有前景且功能先进的应用(比如:人脸识别或目标跟踪等).从图像处理的基本操作出发,计算机 ...

  7. Computer:少儿编程—每个人都应该学习编程,它能教你如何思考—编程入门的简介(编程语言的特点种类开发工具对比人类语言)、编程应用、编程意义之详细攻略

    Computer:少儿编程-每个人都应该学习编程,它能教你如何思考-编程入门的简介(编程语言的特点&种类&开发工具&对比人类语言).编程应用.编程意义之详细攻略 导读:乔布斯说 ...

  8. 软件设计师c语言做题技巧,干货!软件设计师备考攻略

    原标题:干货!软件设计师备考攻略 软件设计师属于软考中级.可能大家会觉得中级呀,听起来有点难,我一点基础也没有,怎么考中级啊. 大家不用慌,听上去好像很有难度,但如果你备考计划准备的好,其实是可以考过 ...

  9. c语言二级考试程序设计题难吗,计算机二级考试:题库抽的不是题是“命”!附赠考试通关全攻略!...

    原标题:计算机二级考试:题库抽的不是题是"命"!附赠考试通关全攻略! 四六级的报名刚截止不久, 考研复试如火如荼地进行, 计算机二级考试如约而至. 今天是考试第一天 老新猜你一定有 ...

  10. Python语言学习:python语言代码调试—异常处理之详细攻略

    Python语言学习:python语言代码调试-异常处理之详细攻略 目录 python语言代码调试-异常处理 异常捕捉可以使用 try/except 语句 相关文章 Python3 错误和异常 | 菜 ...

最新文章

  1. elementui的el-tree第一次加载无法展开和选中的问题
  2. cgo的几种使用方式
  3. C#之基本知识和语法3 - 数据类型
  4. android studio gradle 打出jar,同时将依赖的第三方jar打包在一起
  5. Android SDK Manager 更新慢解决办法
  6. 计算机应用技术的创新
  7. python 石头剪刀布,Python石头剪刀布完整代码
  8. 设置windows服务依赖项
  9. Altium Designer(3)-绘制PCB封装库
  10. matlab卡方拟合优度检验,卡方拟合优度检验在教学中的应用及Matlab实现_刘泽显...
  11. 深度学习面试题:计算机视觉训练技巧
  12. 闲置台式机+文件服务器,闲置主机秒变家用NAS,让你的闲置电脑变存储中心
  13. cookie基础知识
  14. Fractional Laplacian
  15. new Date兼容iOS和Android
  16. Android-服务Service(2)-bind绑定Service及两种生命周期
  17. Xilinx IDELAYCTRL
  18. 【项目】不用数据库实现留言板(用本地文件)
  19. C语言获取MTK平台系统资源信息(CPU/GPU/fps/温度等),保存为表格形式输出
  20. 破解美团外卖的 _token算法

热门文章

  1. Visio绘制维恩图举例
  2. UE4编译错误:Unable to delete XXX
  3. NTFS文件系统文件删除对比
  4. 修真院教学模式四大体系之职业素养
  5. Vue.js---关闭语法检查
  6. 前端程序员为何焦虑?web前端未来终将是什么样?
  7. springmvc防xss脚本注入攻击,springmvc过滤html和js标签,html和js标签转义
  8. 网站建设之需要改进的地方
  9. 个人配置环境和跑代码的一些坑
  10. 0045-一个Dashbord页面监控多个消费者