博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Go语言中结构体的使用-第2部分OOP
阅读量:5049 次
发布时间:2019-06-12

本文共 2413 字,大约阅读时间需要 8 分钟。

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中的语法。OOP编程还会涉及到接口,反射等技术。

结构体第二部分完!

原文出自:
微信关注:小韩说课
小韩说课

转载于:https://www.cnblogs.com/hanzk/p/9922587.html

你可能感兴趣的文章
UIActionSheet 修改字体颜色
查看>>
Vue 框架-01- 入门篇 图文教程
查看>>
Spring注解之@Lazy注解,源码分析和总结
查看>>
多变量微积分笔记24——空间线积分
查看>>
Magento CE使用Redis的配置过程
查看>>
poi操作oracle数据库导出excel文件
查看>>
(转)Intent的基本使用方法总结
查看>>
Mac 下的Chrome 按什么快捷键调出页面调试工具
查看>>
Windows Phone开发(24):启动器与选择器之发送短信
查看>>
JS截取字符串常用方法
查看>>
Google非官方的Text To Speech和Speech Recognition的API
查看>>
stdext - A C++ STL Extensions Libary
查看>>
Django 内建 中间件组件
查看>>
bootstrap-Table服务端分页,获取到的数据怎么再页面的表格里显示
查看>>
进程间通信系列 之 socket套接字及其实例
查看>>
天气预报插件
查看>>
Unity 游戏框架搭建 (十三) 无需继承的单例的模板
查看>>
模块与包
查看>>
mysql忘记root密码
查看>>
apache服务器中设置目录不可访问
查看>>