Go语言中结构体的使用-第2部分OOP
1 概述
结构体的基本语法请参见:Go语言中结构体的使用-第1部分结构体。
结构体除了是一个复合数据之外,还用来做面向对象编程。Go 语言使用结构体和结构体成员来描述真实世界的实体和实体对应的各种属性。也就意味着结构体类型可以类比为其他语言中的“类class”, 而结构体数据可以类比为其他语言中的 “对象”。
本文就说说结构体中,面向对象的部分。
2 构造工厂函数
在面向对象编程中,实例化对象时往往需要完成很多业务逻辑,例如初始数据合理性,获取需要的资源等。在经典的OOP程序中,都会提供构造方法,用于在实例化对象时完成特定功能。
Go语言中,没有class,因此没有典型意义的构造方法。但我们可以定义一个函数,用来实例化结构体对象,在函数内完成特定功能,实现构造函数的功能,这就是构造工厂函数。演示如下:
type Product struct {
Name string
Price float64
}
func NewProduct(name string, price float64) *Product {
// 此处完成初始化业务逻辑
// 得到Product对象
return &Product{
Name: name,
Price: price,
}
}
// 需要 Product 对象时:
p := NewProduct("ThinkPad T480", 8008)
注意,在OOP编程中,通常认为对象是引用用传递,因此我们的构造函数返回的是 *Product
同时函数内使用 &Product
,这样得到的对象为引用传递(Go语言对结构体类型自动解析引用)。
3 成员方法(接收器)
若要为成员增加方法,需要在函数上定义接收器,用来接收调用该方法的成员对象。接收器定义如下:
func (p *Product) Sale() {
fmt.Println("Product: ", p.name, " is on Sale")
}
语法中,(p *Product)
就是接收器。通过定义可知,该接收器可以让函数接受一个 *Product
类型的参数,也就是调用该函数的对象。调用方法为:
pro := &Product{
name: "ThinkPad T480"
}
// 当作成员去调用
// 调用时,将调用函数的 pro,作为参数传递给函数 Run 的接收器 m。这样就可以访问 pro 对象了。
pro.Sale()
同样,面向对象中对象通常为引用类型,因此接收器的定义也是 *Product
的引用类型。
4 继承,内嵌结构体
Go语言中结构体对象间的继承,通过内嵌结构体语法实现。演示:
type Product struct {
Name string
Price float64
}
func (p *Product) Sale() {
fmt.Println("Product: ", p.name, " is on Sale")
}
type Book struct {
// 嵌入Product结构体
Product
Author string
Publish string
}
定义 Book 时,内嵌了 Product 结构体。其中 Book 称为子结构体(派生,扩展),Product成为父结构体(基础)。实例化的 Book 结构体对象,可以直接访问 Product 结构体中定义的成员包括属性和方法。演示:
v := &Book{}
// 访问内嵌结构体属性
v.Name = "笑傲江湖"
v.Author = "金庸"
// 调用内嵌结构体方法
v.Sale()
内嵌还支持:
多继承,可以同时内嵌多个结构体,称之为多继承。但要保证所继承的结构体间没有同名成员,否则出错。
间接访问,字结构体对象支持通过父结构体对象访问继承的成员,语法为 v.Product.Name
,效果与 v.Name
一致。可以理解为是一种快捷语法。
直接初始化,可以直接为内嵌结构体提供初始化操作。演示为:
p := &Book{
Product: &Product{
Name: "天龙八部"
Price: 42.8
}
Author: "金庸"
}
5 重写,override
在内嵌继承中,若子与父结构体存在同名成员,实例化的子结构体成员,访问到的是字结构体定义的成员。这个现象称之为重写override。演示:
type Product struct {
Name string
Price float64
}
func (p *Product) Sale() {
fmt.Println("Product: ", p.name, " is on Sale")
}
type Book struct {
// 嵌入Product结构体
Product
Author string
Publish string
Price float64
}
v := &Book{}
// 访问内嵌结构体属性
// 以下代码访问的是 Book 中定义的 Price 属性
v.Price = 42.8
// 测试:
fmt.Println(v.Product.Price) // 结果为 0
注意,继承是一个查找 过程。先在当前结构体对象中查找,如果没有向内嵌结构体中查找,直到最内层内嵌结构体。重写就是由于在当前结构体对象中查找到了,就不需要再去嵌入结构体对象中查找了,不是一个成员替换过程。
结构体,实例化,继承,重写示意图如下:
以上就是结构体提供的关于OOP中的语法。OOP编程还会涉及到接口,反射等技术。
结构体第二部分完!
原文出自:小韩说课
微信关注:小韩说课
Go语言中结构体的使用-第2部分OOP的更多相关文章
- C语言中结构体赋值问题的讨论
今天帮师姐调一个程序的BUG,师姐的程序中有个结构体直接赋值的语句,在我印象中结构体好像是不能直接赋值的,正如数组不能直接赋值那样,我怀疑这个地方有问题,但最后证明并不是这个问题.那么就总结一下C语言 ...
- C语言中结构体对齐问题
C语言中结构体对齐问题 收藏 关于C语言中的结构体对齐问题 1,比如: struct{short a1;short a2;short a3;}A;struct{long a1;short a2;}B; ...
- C语言中结构体赋值问题的讨论(转载)
今天帮师姐调一个程序的BUG,师姐的程序中有个结构体直接赋值的语句,在我印象中结构体好像是不能直接赋值的,正如数组不能直接赋值那样,我怀疑这个地方有问题,但最后证明并不是这个问题.那么就总结一下C语言 ...
- 6. Go 语言中结构体的使用
1. 结构体的定义格式 在go语言中结果的定义格式如下: 123 type structName struct { filedList} 列子如下: 1234 type Person struct { ...
- Go语言中结构体的使用-第1部分结构体
1 概述 结构体是由成员构成的复合类型.Go 语言使用结构体和结构体成员来描述真实世界的实体和实体对应的各种属性.结构体成员,也可称之为成员变量,字段,属性.属性要满足唯一性.结构体的概念在软件工程上 ...
- 关于C语言中结构体中的结构体成员导致的字节对齐问题
关于结构体的字节对齐是什么,就不赘述,再此附上一篇文章,介绍字节对齐:http://www.linuxsong.org/2010/09/c-byte-alignment/ 这里的结构体字节对齐的数据类 ...
- C语言中结构体參数变量的传递
[文章摘要] 在C语言中,结构体參数变量常常作为函数的參数来进行传递.但假设參数设置不当.会出现内存问题. 本文以实际的程序代码为例.具体地介绍怎样正确地使用结构体參数变量.为相关的开发工作提供了參考 ...
- C语言中结构体的访问方法解读
在C语言中,对结构体的访问一般有两种常规方式:"."访问和"->"访问.那么两者有什么区别呢?对C语言有一定了解的同学应该知道,我们新建一个结构体的时候, ...
- c语言中结构体指针
1.指向结构体的指针变量: C 语言中->是一个总体,它是用于指向结构体,如果我们在程序中定义了一个结构体,然后声明一个指针变量指向这个结构体.那么我们要用指针取出结构体中的数据.就要用到指向运 ...
随机推荐
- Spring学习---Spring中利用jackson进行JSON转换
Spring中利用jackson进行JSON转换 import java.util.List; import com.fasterxml.jackson.core.JsonProcessingExce ...
- zabbix监控 linux/windows 主机tcp连接状态
更新内容:1).增加了对windows主机的tcp连接状态的监控2).修改linux主机的监控配置,使linux与windwos主机能够使用相同的模板tcp的连接状态对于监控服务器,尤其是Web服务器 ...
- PHP面试常用算法(推荐)
一.冒泡排序 基本思想: 对需要排序的数组从后往前(逆序)进行多遍的扫描,当发现相邻的两个数值的次序与排序要求的规则不一致时,就将这两个数值进行交换.这样比较小(大)的数值就将逐渐从后面向前面移动. ...
- OC文件操作1
主要内容: 1)文件操作:对文件本身的操作(NSManager) 2)对文件内容的操作(NSHandle) 1.NSManager 创建一个单例的file manager的对象 //创建一个单例的fi ...
- HTTP协议图--HTTP 报文实体
1. HTTP 报文实体概述 HTTP 报文结构 大家请仔细看看上面示例中,各个组成部分对应的内容. 接着,我们来看看报文和实体的概念.如果把 HTTP 报文想象成因特网货运系统中的箱子,那么 H ...
- MVC中使用过滤器做权限认证需要注意的地方
最近一项目接近尾声,正准备调试的时候发现一条原本不应该执行的SQL语句执行报错了,本就不应该执行,所以当然也就出错,找了一下,问题如下. 我这里是直接重写OnActionExecuting方法来达到目 ...
- JS实现键盘监听(包括组合键)
依然使用案例驱动~案例是学习的最好实践! <html> <head> <meta http-equiv="Content-Type" co ...
- 【3】【MOOC】Python游戏开发入门-北京理工大学【第三部分-游戏开发之机制(事件处理机制)】
学习地址链接:http://www.icourse163.org/course/0809BIT021E-1001873001?utm_campaign=share&utm_medium=and ...
- Linux Min装机--配置JDK替换OpenJDK
@Linux Min装机--配置JDK替换OpenJDK 1.将下载的JDK压缩包解压到/usr/lib/jvm wil use : 一.文件复制命令cp 命令格式:cp [-adfilp ...
- C/C++ 格式化读取和读取一行
文件内容 23 21 4 1 1 0 114 1 1 1 8 112 5 0 0 0 114 1 0 0 0 115 52 4 1 0 1 134 4 0 1 12 131 4 1 1 0 133 5 ...