Golang继承模拟实例详解

 更新时间:2016年07月27日 11:14:28   作者:轩脉刃  
这篇文章主要介绍了Golang继承模拟方法,结合实例形式分析了Go语言实现继承的原理与相关操作技巧,需要的朋友可以参考下

本文实例讲述了Golang继承模拟实现方法。分享给大家供大家参考,具体如下:

问题由一个需求引起:

web的controller,希望创建一个基类,然后在子类的controller中定义action方法,基类有一个run函数能根据字符串自动找到子类的action方法。

如何解决呢? -- 用继承

示例分析继承

首先这个需求是很普遍的,由于脑中有继承概念,所以想当然地以为这个很容易实现:

复制代码 代码如下:
package main
import(
    "reflect"
)
type A struct {
}
func (self A)Run() {
    c := reflect.ValueOf(self)
    method := c.MethodByName("Test")
    println(method.IsValid())
}
type B struct {
    A
}
func (self B)Test(s string){
    println("b")
}
func main() {
    b := new(B)
    b.Run()
}

B继承A,B中调用Run方法,自然会调用到A的Run方法,然后我根据string“Test”,希望能找到B中(B是子类)的Test方法。

用继承的观点看没错,实际运行呢?method.IsValid() 返回false。很明显,这里的Test方法是找不到的。

分析问题,首先这里“继承”两个词就用错了,在go中不应该提及“继承”这个词,我更选择使用“嵌套”这个词。B是嵌套了A,所以这里的b.Run()实际上是语法糖,调用的是b.A.Run()。这里Run的全部环境都在A中。所以是找不到A的Test的。

感谢@hongqirui和@海意,在它们帮忙下找到了解决方法:

复制代码 代码如下:
package main
import(
    "reflect"
)
type A struct {
    Parent interface{}
}
func (self A)Run() {
    c := reflect.ValueOf(self.Parent)
    method := c.MethodByName("Test")
    println(method.IsValid())
}
type B struct {
    A
}
func (self B)Test(s string){
    println("b")
}
func (self B)Run(){
    self.A.Run()
}
func main() {
    b := new(B)
    b.A.Parent = b
    b.Run()
}

在父类中加一个interface{}记录子类!!这样问题就迎刃而解了!method.IsValid()返回了true。

结论

所以在golang中要模拟普通的继承,除了使用嵌套之外,还需要在父类中“注册”子类的信息!

希望本文所述对大家Go语言程序设计有所帮助。

相关文章

  • Golang科学计数法转换string数字输出的实现

    Golang科学计数法转换string数字输出的实现

    最近接手一个商城运单号模块,接手后发现有部分运单号返回给前端是按照科学计数法的方式返回,本文就介绍一下Golang科学计数法转换string数字输出,感兴趣的可以了解一下
    2021-07-07
  • 深入了解Go语言中database/sql是如何设计的

    深入了解Go语言中database/sql是如何设计的

    在 Go 语言中内置了 database/sql 包,它只对外暴露了一套统一的编程接口,便可以操作不同数据库,那么database/sql 是如何设计的呢,下面就来和大家简单聊聊吧
    2023-07-07
  • go pprof 的使用操作代码

    go pprof 的使用操作代码

    pprof 是 go 中进行性能分析的工具,可以提供可视化数据查看,这篇文章主要介绍了go pprof 的使用操作,需要的朋友可以参考下
    2022-09-09
  • golang beego框架环境搭建过程

    golang beego框架环境搭建过程

    这篇文章主要为大家介绍了golang beego框架环境搭建的过程脚本,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步早日升职加薪
    2022-04-04
  • 使用Go语言编写一个极简版的容器Container

    使用Go语言编写一个极简版的容器Container

    Docker作为一种流行的容器化技术,对于每一个程序开发者而言都具有重要性和必要性,因为容器化相关技术的普及大大简化了开发环境配置、更好的隔离性和更高的安全性,对于部署项目和团队协作而言也更加方便,本文将尝试使用Go语言编写一个极简版的容器
    2023-10-10
  • golang并发锁使用详解

    golang并发锁使用详解

    这篇文章主要介绍了golang并发锁使用详解的相关资料,需要的朋友可以参考下
    2023-02-02
  • Go Gorm 示例详解

    Go Gorm 示例详解

    Gorm是一款高性能的Golang ORM库,便于开发人员提高效率,本文介绍了Gorm的基本概念、数据库连接、基本操作(创建表、新增记录、查询记录、修改记录、删除记录)等,本文介绍Go Gorm的相关知识,感兴趣的朋友一起看看吧
    2025-01-01
  • Golang实现短网址/短链服务的开发笔记分享

    Golang实现短网址/短链服务的开发笔记分享

    这篇文章主要为大家详细介绍了如何使用Golang实现短网址/短链服务,文中的示例代码讲解详细,具有一定的学习价值,感兴趣的小伙伴可以了解一下
    2023-05-05
  • golang 删除切片的某个元素及剔除切片内的零值方式

    golang 删除切片的某个元素及剔除切片内的零值方式

    这篇文章主要介绍了golang 删除切片的某个元素及剔除切片内的零值方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-04-04
  • Golang实现复合数据类型

    Golang实现复合数据类型

    Go语言的复合数据类型包括数组、切片、映射、结构体和接口,本文就来介绍一下Golang实现复合数据类型,具有一定的参考价值,感兴趣的可以了解一下
    2025-02-02

最新评论