Go:面向"对象"
一、封装
- 封装的实现步骤:
- 将结构体、字段的首字母小写(不能被导出);
- 给结构体所在的包提供一个工厂模式的函数,首字母大写。类似一个构造函数;
- 提供一个首字母大写的方法,由于获取结构体属性的值。
二、继承
2.1 在 golang 中,如果一个结构体嵌套了另一个匿名结构体,那么这个结构体可以直接访问匿名结构体的字段和方法,从而实现了继承。
type Animal struct {
Name string
Age int
}
type TaiDi struct {
Animal // 这就是嵌套匿名结构体Animal
}
func (a *Animal) Eat() {
fmt.Printf("%s今年%d岁,它正在吃东西...", a.Name, a.Age)
}
func main() {
var td TaiDi
td.Animal.Name = "泰迪"
td.Animal.Age = 1
// 可以简化成
// td.Name = "泰迪"
// td.Age = 1
td.Eat()
}
2.2 如果结构体和匿名结构体有相同的字段或者方法时,编译器采用就近原则访问,如果希望访问匿名结构体的字段或方法,可以通过匿名结构体来区分。
type B struct {
Name string
}
type C struct {
Name string
A
B
}
func (a *A) Eat() {
fmt.Printf("%s正在吃饭...\n", a.Name) // AA正在吃饭...
}
func (b *B) Eat() {
fmt.Printf("%s正在吃饭...\n", b.Name) // 正在吃饭...
}
func main() {
var c C
c.Name = "CC"
c.A.Name = "AA"
c.A.Eat()
c.B.Eat()
}
2.3 如果一个结构体嵌套了一个有名结构体,这种模式就是组合,如果是组合关系,那么在访问组合的结构体的字段或方法时,必须带上这个结构体的名字。
type A struct {
Name string
}
type B struct {
a A
}
func (a *A) Eat() {
fmt.Printf("%s正在吃饭...\n", a.Name) // 佩奇正在吃饭...
}
func main() {
var b B
// b.Name = "佩奇" ,会报错,必须指定有名结构体的名字,如下
b.a.Name = "佩奇"
b.a.Eat()
}
2.4 嵌套匿名结构体后,也可以在创建结构体实例时,直接指定各个匿名结构体字段的值。
type Goods struct {
Name string
Price float64
}
type Brand struct {
Name string
Address string
}
type TV struct {
*Goods
*Brand
}
func main() {
tv1 := TV{&Goods{"电视机", 99.8}, &Brand{"长虹", "四川"}}
tv2 := TV{
&Goods{
Name: "电视机",
Price: 99.8,
},
&Brand{
Name: "长虹",
Address: "四川",
}}
fmt.Println(tv1, tv2) // {0xc000004480 0xc0000044a0} {0xc0000044c0 0xc0000044e0}
fmt.Println(tv1.Goods, tv1.Brand) // &{电视机 99.8} &{长虹 四川}
fmt.Println(*tv1.Goods, *tv1.Brand) // {电视机 99.8} {长虹 四川}
}
2.5 结构体嵌套基本数据类型也是可以的
type A struct {
int
}
func main() {
var a A
a.int = 100
fmt.Println(a) // {100}
}
四、多态
在学习多态之前,先学习接口。
接口体现多态的两种形式:
①多态参数:在接口这一章中,使用了Usb接口案例,即可以接收手机实例,又可以接收相机实例,从而体现了 Usb 接口的多态;
②多态数组:给 Usb 数组中,存放 Phone 和 Camera 结构体的实例,Phone 还有一个特有的 Call 方法。遍历Usb数组,如果是 Phone 结构体的实例,除了调用 Usb 接口中声明的方法外,还需要调用 Call 方法。本示例在断言的最佳实践示例1中。
五、面向对象项目体验
https://files.cnblogs.com/files/believepd/familyaccount.zip
Go:面向"对象"的更多相关文章
- 变量-数据类型-对象-如何编写python脚本
标识符的命名规则变量是标识符的例子. 标识符 是用来标识 某样东西 的名字.在命名标识符的时候,你要遵循这些规则:标识符的第一个字符必须是字母表中的字母(大写或小写)或者一个下划线(‘ _ ’).标识 ...
- .NET面试题集锦②(Part 二)
一.前言部分 文中的问题及答案多收集整理自网络,不保证100%准确,还望斟酌采纳. 1.实现产生一个int数组,长度为100,并向其中随机插入1-100,并且不能重复. ]; ArrayList my ...
- 架构之路(九)Session Per Request
前面的两篇反应很差:没评论没赞.很伤心啊,为什么呢?搞得我好长一段时间都没更新了——呵呵,好吧,我承认,这只是我的借口.不过,还是希望大家多给反馈.没有反馈,我就只能猜了:前面两篇是不是写得太“粗”了 ...
- 新作《ASP.NET Web API 2框架揭秘》正式出版
我觉得大部分人都是“眼球动物“,他们关注的往往都是目光所及的东西.对于很多软件从业者来说,他们对看得见(具有UI界面)的应用抱有极大的热忱,但是对背后支撑整个应用的服务却显得较为冷漠.如果我们将整个“ ...
- Hibernate学习笔记5
hql语句的查询(hibernate query language) hql和sql语句的区别sql:语言关系型数据库里面的通用查询,结构化查询语言,查看的是表以及表的列hql是hibernate中独 ...
- 在PHP中使用Mysqli操作数据库
PHP的 mysqli 扩展提供了其先行版本的所有功能,此外,由于 MySQL 已经是一个 具有完整特性的数据库服务器 , 这为PHP 又添加了一些新特性 . 而 mysqli 恰恰也支持了 这些新特 ...
- ASP.NET Web API 2框架揭秘
ASP.NET Web API 2框架揭秘(.NET领域再现力作顶级专家精讲微软全新轻量级通信平台) 蒋金楠 著 ISBN 978-7-121-23536-8 2014年7月出版 定价:108.0 ...
- JAVA Day6
1.对象:用来描述客观事物的一个实体,由一组属性和方法组成 2.属性--对象具有的各种特征 *每个对象的每个属性都拥有特定值 *例如:张浩和李明的年龄.姓名不一样 3.方法--对象执行的操 ...
- 《JavaScript面向对象编程指南》译者序
相对于Perl.Python等动态脚本语言来说,JavaScript确实是一门饱受误解的语言.对于译者这种从20世纪90年代末走过来的C++程序员来说,尤其如此.在那个年代,提起JavaScript总 ...
随机推荐
- Math对象常用方法(取整细节)
Math 对象 Math 对象用于执行数学任务. 1.常用属性: 1.E :返回算术常量e,即自然对数的底数(约2.718) 2.PI :返回圆周率,约3.14159 2.常用方法 Math.方 ...
- bzoj 1444: [Jsoi2009]有趣的游戏【AC自动机+dp+高斯消元】
https://blog.sengxian.com/solutions/bzoj-1444 orz 一直是我想错了,建出AC自动机之后,实际上这个定义是设f[i]为经过i节点的 * 期望次数 * ,因 ...
- java多线程下模拟抢票
我们设置三个对象分别同时抢20张票,利用多线程实现. public class Web123506 implements Runnable{ private int ticteksNums=20;// ...
- hasLayout原理【转】
项目中经常用到:*html .clearfix{ height:1%;} //IE6能识别*+html .clearfix{height:1%;} //IE7能识别1,有很多方式能触发hasLayo ...
- Python爬虫库-Beautiful Soup的使用
Beautiful Soup 是一个可以从HTML或XML文件中提取数据的Python库,简单来说,它能将HTML的标签文件解析成树形结构,然后方便地获取到指定标签的对应属性. 如在上一篇文章通过爬虫 ...
- urllib的高级用法
Handler简介 我们可以把他理解为各种处理器,有专门处理登录验证的,有处理cookies的,有处理代理设置的.利用他们,我们几乎可以做到HTTP请求中的所有事情. 首先,介绍一下 urllib.r ...
- ASP.NET CORE 使用 EF CORE访问数据库
asp.net core通过ef core来访问数据库,这里用的是代码优先,通过迁移来同步数据库与模型. 环境:vs2017,win10,asp.net core 2.1 一.从建立asp.net c ...
- 选择排序 分类: 算法 c/c++ 2014-10-10 20:32 509人阅读 评论(0) 收藏
选择排序(假设递增排序) 每次选取从当前结点到末尾结点中最小的一个与当前结点交换,每一轮固定一个元素位置. 时间复杂度O(n^2),空间复杂度O(1).下面的示例代码以带头结点的链表为存储结构: #i ...
- assets与res/raw资源目录的区别
1.简介 assets和res/raw工程目录下都可以放一些小于1M的文件(2.3版本以前要求,否则将不能读出数据.),这些文件将被原样打包到APK中应用使用. 2.不同 assets目录下的文件将原 ...
- 转 PHP in_array() 函数
实例 在数组中搜索值 "Glenn" ,并输出一些文本: <?php $people = array("Bill", "Steve", ...