前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Golang面向对象编程之继承&虚基类【组合&接口】

Golang面向对象编程之继承&虚基类【组合&接口】

作者头像
Allen.Wu
修改于 2022-11-11 17:19:26
修改于 2022-11-11 17:19:26
1.9K00
代码可运行
举报
运行总次数:0
代码可运行

[TOC]

Golang面向对象编程之继承&虚基类【组合&接口】

201808

相关说明

Golang里面没有像C++一样有继承相关的概念,但是我们却可以实现继承相关的用法,这就要用到struct、interface这两个结构。

Golang里面有组合的概念,也就是一个struct 里面可以包含一个或者多个struct,struct可以近似理解为面向对象编程中的class,但是不能等同,有很多区别。如果一个struct实现了某个接口的所有方法,那么只要是包含这个struct的所有其他struct也都是实现了这个接口的所有方法

实现 class 类

要想实现class类的用法,那么就要用到struct结构,通过给定struct定义某个成员变量或成员方法就可以实现类的方法

  1. 通过type struct 定义一个struct【类】 type rsaSecurity struct { }
  2. 再定义一个这个类的变量,也就是对象 var RsaSecuritySrv rsaSecurity 类似于构造函数的定义,也可以通过new一个对象来使用,二选一。
  3. 实现一个这个struct类的方法,需要注意要显示的声明所属对象,即(rs *rsaSecurity) // 加密 func (rs *rsaSecurity) RsaEncrypt(origData []byte) ([]byte, error) { //解密pem格式的公钥 block, _ := pem.Decode(publicKey) if block == nil { return nil, errors.New("public key error") } // 解析公钥 pubInterface, err := x509.ParsePKIXPublicKey(block.Bytes) if err != nil { return nil, err } // 类型断言 pub := pubInterface.(*rsa.PublicKey) //加密 return rsa.EncryptPKCS1v15(rand.Reader, pub, origData) } 注意这里是否使用指针,在于是否能够是否需要彻底修改成员变量的值。
  4. 在任何需要调用这个成员方法的时候,通过对象来调用 func main() { data, _ := RsaSecuritySrv.RsaEncrypt([]byte(encrypt)) }

实现继承

直接上代码如下,很简单,主要就是一个struct里面包含一个匿名的struct,也就是通过匿名组合来实现

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package main

import (
    "fmt"
)

// 【基类】
//定义一个最基础的struct类MsgModel,里面包含一个成员变量msgId
type MsgModel struct {
    msgId   int
    msgType int
}

// MsgModel的一个成员方法,用来设置msgId
func (msg *MsgModel) SetId(msgId int) {
    msg.msgId = msgId
}

func (msg *MsgModel) SetType(msgType int) {
    msg.msgType = msgType
}

//【子类】
// 再定义一个struct为GroupMsgModel,包含了MsgModel,即组合,但是并没有给定MsgModel任何名字,因此是匿名组合
type GroupMsgModel struct {
    MsgModel

    // 如果子类也包含一个基类的一样的成员变量,那么通过子类设置和获取得到的变量都是基类的
    msgId int
}

func (group *GroupMsgModel) GetId() int {
    return group.msgId
}

/*
func (group *GroupMsgModel) SetId(msgId int) {
    group.msgId = msgId
}
*/

func main() {
    group := &GroupMsgModel{}

    group.SetId(123)
    group.SetType(1)

    fmt.Println("group.msgId =", group.msgId, "\tgroup.MsgModel.msgId =", group.MsgModel.msgId)
    fmt.Println("group.msgType =", group.msgType, "\tgroup.MsgModel.msgType =", group.MsgModel.msgType)
}

实现虚基类的用法

Golang可以通过匿名组合来实现继承。

Golang可以interface + struct来实现虚基类的用法,必须要实现interface中定义的方法。

1,定义一个interface接口MsgModel,包含了一些方法。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
type MsgModel interface {
    Persist(context context.Context, msg interface{}) bool
    PersistOnSensitive(context context.Context, session_type, level, SensitiveStatus int32, msg interface{}) bool
}

3,定义一个类型msgModelImpl,用来实现接口类型

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
定义一个struct用来实现接口类型
type msgModelImpl struct{}


定义一个变量MsgModelImpl等于msgModelImpl,相当于可以通过MsgModelImpl来调用msgModelImpl的成员
var MsgModelImpl = msgModelImpl{}

实现接口的两个方法
func (m msgModelImpl) Persist(context context.Context, msgIface interface{}) bool {
// 具体实现省略
}

func (m msgModelImpl) UpdateDbContent(context context.Context, msgIface interface{}) bool {
// 具体实现省略
}

4, 定义一个struct类型的msgService,包含上述接口类型MsgModel,相当于组合了。这样的话,这个类型就需要要实现接口方法。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
type msgService struct {
   msgModel MsgModel
}

5, 再定义一个变量MsgService,首字母大写,并且赋值为msgService对象,同时给成员msgModel赋值为上述已经实现了接口的struct对象MsgModelImpl。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
将上述已经实现接口类型的类型(MsgModelImpl) 赋值给此变量(此变量并且要是包含了接口类型的类型), 然后这个变量就可以供外部调用
var  MsgService = msgService{
        msgModel:  MsgModelImpl,
}

6, 通过MsgService调用接口方法

7, 小结:

  • MsgModel 是一个interface
    • interface 是一组抽象方法(未具体实现的方法/仅包含方法名参数返回值的方法)的集合
  • msgModelImpl是一个struct,它实现了MsgModel这个interface的所有方法
    • 如果实现了 interface 中的所有方法,即该类/对象就实现了该接口
  • MsgModelImpl是msgModelImpl这个struct的对象
  • msgService是一个struct,它包含了MsgModel,相当于组合
  • MsgService是msgService这个struct的对象,并对成员变量赋值

欢迎关注我的公众号,方便更快捷的接收最新优质文章
欢迎关注我的公众号,方便更快捷的接收最新优质文章
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-09-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 后端系统和架构 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Golang 编程思维和工程实战
Golang 的一些编程思维和思想,以及总结一些常见的优雅编程实战技巧。 作者:allendbwu,腾讯 PCG 后台开发工程师 一 Golang 编程思维 首先,我们先来看下最基本的,就是 Golang 的学习技巧,比如通读 Golang 的一些好的文章: Frequently Asked Questions (FAQ) FAQ 的中文翻译 Go 精华文章列表 Go 相关博客列表 Go Talks 要通读 golang 官方的编码规范,主要是要参考官方的 CodeReviewComments 和 E
腾讯技术工程官方号
2021/11/23
9180
Golang 语言是面向对象编程风格的编程语言吗?
Golang 语言是面向对象语言吗?Golang 语言官方的回答是 Yes and no。什么意思呢?Golang 语言是面向对象语言,Golang 语言也不是面向对象语言。
frank.
2021/06/22
7.4K0
Golang面向对象编程之构造函数【struct&new】
构造函数是一种特殊的方法,主要用来在创建对象时初始化对象,即为对象成员变量赋初始值。特别的一个类可以有多个构造函数 ,可根据其参数个数的不同或参数类型的不同来区分它们,即构造函数的重载。
Allen.Wu
2019/12/12
8.8K0
学习go语言编程之面向对象
在Golang中,可以给任意类型(包括内置类型,但不包括指针类型)添加相应的方法。
编程随笔
2023/10/15
1800
Golang工程经验(上)
作为一个C/C++的开发者而言,开启Golang语言开发之路是很容易的,从语法、语义上的理解到工程开发,都能够快速熟悉起来;相比C、C++,Golang语言更简洁,更容易写出高并发的服务后台系统
李海彬
2018/10/08
2K1
Golang工程经验(上)
Go 面向对象编程篇(八):空接口、反射和泛型
熟悉 Java 的同学应该都知道,在这个号称血统最纯正的面向对象编程语言中,「万事万物皆对象」,并且所有类都继承自祖宗类「Object」,所以 Object 类型变量可以指向任何类的实例。
学院君
2023/03/03
1K0
Go 面向对象编程篇(八):空接口、反射和泛型
Go 面向接口编程实战
使用接口能够让我们写出易于测试的代码,然而很多工程师对 Go 的接口了解都非常有限,也不清楚其底层的实现原理,这成为了开发可维护、可测试优秀代码的阻碍。
一个会写诗的程序员
2022/06/12
2.3K0
Go 面向接口编程实战
Golang接口类型-上篇
接口是计算机系统中多个组件共享的边界,不同的组件能够在边界上交换信息。接口的本质是引入一个新的中间层,调用方可以通过接口与具体实现分离,解除上下游的耦合,上层的模块不再需要依赖下层的具体模块,只需要依赖一个约定好的接口
仙人技术
2021/10/22
6270
通过 GoLang 实现面向对象思想
面向对象是一种十分流行的编程思想,他改变了传统的面向过程编程思想看待问题的方式,先将所有实体定义为对象,然后为对象添加各自必须的属性和动作,从而让程序在设计的过程中,更为方便的抽取出实体的共性与差异,实现组件的替换以及更为复杂的各个设计模式,从而实现程序设计的高内聚与低耦合,进而提升程序的重用性、灵活性、扩展性、可读性和安全性。 面向对象思想并不基于某个编程语言,例如在典型的面向过程语言 C 语言中,通过结构体、void 指针、函数指针等语法,我们就完全可以实现出面向对象的语法特征,事实上,nginx 正是使用 C 语言的这些特性,通过面向对象的思想来组织整个工程项目的。 golang 语言中并没有明确提出面向对象的概念,但基于 golang 已有的语法,我们同样可以实现面向对象的思想,本文我们就来详细介绍一下。
用户3147702
2022/06/27
2730
通过 GoLang 实现面向对象思想
Golang interface 接口详细原理和使用技巧
interface 接口在 Go 语言里面的地位非常重要,是一个非常重要的数据结构,只要是实际业务编程,并且想要写出优雅的代码,那么必然要用上 interface,因此 interface 在 Go 语言里面处于非常核心的地位。
Allen.Wu
2023/03/01
1.6K0
Golang interface 接口详细原理和使用技巧
Go 语言面向对象教程 —— 接口篇:接口组合
在上述代码中,我们定义了两个 PHP 接口:A 和 B,其中接口 B 继承自 A,这样一来,如果某个类实现了接口 B,则必须实现这两个接口中声明的方法,否则会报错。
学院君
2019/08/08
1.6K0
1小时深入c++面向对象编程
补充:对象只能访问类中pbulic(公有)成员,不能访问private和protected成员
mathor
2018/07/24
6420
1小时深入c++面向对象编程
Golang 语言怎么使用接口编程?
关于 Golang 语言接口的使用,在之前的一篇公众号文章中已经介绍过,未阅读的读者朋友,如果感兴趣,可以按需翻阅文末推荐阅读列表。本文我们主要介绍在 Golang 语言中,如何使用接口编程?以及接口的使用技巧。
frank.
2021/06/22
8840
GoLang接口---上
但是 Go 语言里有非常灵活的 接口 概念,通过它可以实现很多面向对象的特性。接口提供了一种方式来 说明 对象的行为:如果谁能搞定这件事,它就可以用在这儿。
大忽悠爱学习
2022/08/23
5710
GoLang接口---上
grafana后台源码分析(一)
Grafana是监控领域比较出名的开源可视化套件,笔者最近在阅读grafana后台源码,里面有很多值得我们学习借鉴的地方,这里通过文章记录下来。
哈利哥
2022/11/22
2.1K0
grafana后台源码分析(一)
Golang接口类型-下篇
在定义变量时将类型指定为接口的函数签名的接口,此时叫匿名接口,匿名接口常用于初始化一次接口变量的场景
仙人技术
2021/11/01
6360
22.Go面向对象-接口
以上实现非常简单,但是有个问题,在main()函数中,当我们想使用减法操作时,创建减法类的对象,调用其对应的减法的方法。
Devops海洋的渔夫
2022/01/17
3050
22.Go面向对象-接口
Java Review (十四、面向对象----接口)
抽象类是从多个类中抽象出来的模板,如果将这种抽象进行得更彻底,则可以提炼出一种更加特殊的“抽象类”——接口(interface),接口里不能包含普通方法,接口里的所有方法都是抽象方法。Java 8 对接口进行了改进,允许在接口中定义默认方法,默认方法可以提供方法实现。
三分恶
2020/07/16
3260
【面向对象编程】继承
在编程中,继承可以实现代码的复用,减少重复编写代码的工作量。通过继承,子类可以继承父类的属性和方法,并且可以根据需要进行扩展和修改,提高了代码的可维护性和可扩展性。再例如现实世界的复杂性,但事物之间存在某种共性,那么程序设计就需要考虑
用户11288949
2024/09/24
980
【面向对象编程】继承
C/C++面向对象编程之封装
面向过程开发,就像是总有人问你要后续的计划一样,下一步做什么,再下一步做什么,意外、事物中断、突发事件怎么做。理论上来说,任何一个过程都可以通过“顺序,循环,分支”来描述出来,但是实际上,很多项目的复杂度,都不是“顺序循环分支”几句话能说清楚的。稍微大一点的项目,多线程,几十件事情并发, 如果用这种最简单的描述方式,要么几乎无法使用,缺失细节太多,要么事无巨细,用最简单的描述,都会让后期复杂度提升到一个爆炸的状态。
AIoT-KK
2020/07/13
1K0
C/C++面向对象编程之封装
相关推荐
Golang 编程思维和工程实战
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验