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总 ...
随机推荐
- 【黑金教程笔记之001】veriloghdl 扫盲文—笔记&勘误
001_veriloghdl 扫盲文—笔记&勘误 2014/10/31 原文作者:akuei2 联系方式:blog.ednchina.con/akuei2 勘误001: Page 3 0.1 ...
- bzoj 3732: Network【克鲁斯卡尔+树链剖分】
先做最小生成树,这样就保证了最大值最小 然后随便用个什么东西维护一下最大值,我用的树剖log^2,倍增会更快 #include<iostream> #include<cstdio&g ...
- bzoj 2811: [Apio2012]Guard【线段树+贪心】
关于没有忍者的区间用线段树判就好啦 然后把剩下的区间改一改:l/r数组表示最左/最右没被删的点,然后删掉修改后的左边大于右边的:l升r降排个序,把包含完整区间的区间删掉: 然后设f/g数组表示i前/后 ...
- bzoj 1007: [HNOI2008]水平可见直线【半平面交】
其实并不算标准半平面交?但是思路差不多 先按照斜率排序,然后用栈维护凸壳,每遇到重斜率或a[i],s[top-1]交点的x轴在s[top],s[top-1]交点左侧,则说明s[top]被a[i],s[ ...
- Hdu 5384 Danganronpa (AC自动机模板)
题目链接: Hdu 5384 Danganronpa 题目描述: 给出n个目标串Ai,m个模式串Bj,问每个目标串中m个模式串出现的次数总和为多少? 解题思路: 与Hdu 2222 Keywords ...
- iOS 实现复选框 checkbox --转
转自:http://www.cnblogs.com/ygm900/p/3468891.html -(void)checkboxClick:(UIButton *)btn{ btn.select ...
- Windows 7操作系统下Apache的安装与配置(图文详解)
我这里是 Apache2.4.X-win64 首先, 我的操作系统信息如下 Apache2.4-win64的下载 官网 http://www.apachelounge.com/download/ 因 ...
- 【Hibernate】Access to DialectResolutionInfo cannot be null when 'hibernate.dialect' not set
今天用hibernate框架写crm项目时遇到报错: Access to DialectResolutionInfo cannot be null when 'hibernate.dialect' n ...
- js控制页面跳转,清缓存,强制刷新页面
单看标题,必定满脸蒙13. 其实,想表达的仅仅是,在js中通过window.location.href控制页面跳转时,有时会跳转至缓存页面,并没有真正去请求要跳转的地址,导致页面数据未能及时加载刷新. ...
- Jvisualvm--JAVA性能分析工具
JDK自带的JAVA性能分析工具.它已经在你的JDK bin目录里了,只要你使用的是JDK1.6 Update7之后的版本.点击一下jvisualvm.exe图标它就可以运行了. 这里是VisualV ...