首页 > 其他分享 >Go语言实现多态

Go语言实现多态

时间:2023-09-16 23:46:11浏览次数:36  
标签:eating 语言 实现 eater 多态 接口 dog Go name

1. 什么是多态
多态是指根据类型的具体实现采取不同行为的能力。如果某个类型实现了某个接口,那么所有使用这个接口的地方,都可以支持这种类型的值。即不同的数据类型的实体实现提供统一的接口。Go中没有类的概念,它的多态是靠接口来实现的。

2. 在Go中的实现
先定义一个抽象的接口,这个接口规定了结构体应当实现什么方法,比如:

//定义一个eater接口,只要某个结构体实现了这个接口的全部方法,即实现了这个接口
type eater interface {
eat()
}

定义一个通用的函数,这个函数的传入参数接收一个接口类型:

//eating函数接收一个eater接口
func eating(e eater) {
e.eat()
}

对上述的接口做两个实现

type people struct {
name string
age int
}
//people 结构体实现了eat方法,即实现了eater接口的所有方法,因此people实现了eater接口
func (p *people) eat() {
fmt.Printf("%v is eating\n",p.name)
}

type dog struct {
name string
hoster string
age int
}

//dog 结构体也实现了eater接口
func (d *dog) eat() {
fmt.Printf("%v is eating, its hoster is %v\n", d.name,d.hoster)
}

在调用时即可直接调用eating函数,在程序运行时,就可以动态地将接口指向具体的类型,如下:

func main() {
x := &dog{
name : "xiaobai",
age : 3,
hoster : "dahei",
}
d := &people{
name: "dahei",
age : 16,
}

eating(x) //调用eating函数,将x传入,程序可以在运行时动态地把eater接口指向dog类型,从而调用dog的方法。
eating(d)
}

标签:eating,语言,实现,eater,多态,接口,dog,Go,name
From: https://www.cnblogs.com/beatle-go/p/17707551.html

相关文章

  • Go语言连不上 Mysql
    1.dialtcp127.0.0.1:3306:connect:connectionrefused因为mysql安装时,的配置有一个关闭网络连接,所以连不上文件在/etc/my.cnf.d/mariadb-server.cnf把这信skip-networking注释了即可[mysqld]#skip-networking......
  • Llama2-Chinese项目:2.2-大语言模型词表扩充
      因为原生LLaMA对中文的支持很弱,一个中文汉子往往被切分成多个token,因此需要对其进行中文词表扩展。思路通常是在中文语料库上训练一个中文tokenizer模型,然后将中文tokenizer与LLaMA原生tokenizer进行合并,最终得到一个扩展后的tokenizer模型。国内Chinese-LLaMA-Alpaca开源项目......
  • 2023-09-16:用go语言,给你一个整数 n 和一个在范围 [0, n - 1] 以内的整数 p , 它们表示
    2023-09-16:用go语言,给你一个整数n和一个在范围[0,n-1]以内的整数p,它们表示一个长度为n且下标从0开始的数组arr,数组中除了下标为p处是1以外,其他所有数都是0。同时给你一个整数数组banned,它包含数组中的一些位置。banned中第i个位置表示arr[banned[i......
  • R语言决策树、随机森林、逻辑回归临床决策分析NIPPV疗效和交叉验证|附代码数据
    全文链接:http://tecdat.cn/?p=32295原文出处:拓端数据部落公众号临床决策(clinical decision making)是医务人员在临床实践过程中,根据国内外医学科研的最新进展,不断提出新方案,与传统方案进行比较后,取其最优者付诸实施,从而提高疾病诊治水平的过程。在临床医疗实践中,许多事件......
  • 数据代码分享|R语言回归分析:体脂数据、公交绿色出行与全球变暖2案例|附代码数据
    全文链接:http://tecdat.cn/?p=32520原文出处:拓端数据部落公众号通常在现实应用中,我们需要去理解一个变量是如何被一些其他变量所决定的。最近我们被客户要求撰写关于回归分析的研究报告,包括一些图形和统计输出。回答这样的问题,需要我们去建立一个模型。一个模型就是一个公式之......
  • 2023-09-16:用go语言,给你一个整数 n 和一个在范围 [0, n - 1] 以内的整数 p , 它们表示
    2023-09-16:用go语言,给你一个整数n和一个在范围[0,n-1]以内的整数p,它们表示一个长度为n且下标从0开始的数组arr,数组中除了下标为p处是1以外,其他所有数都是0。同时给你一个整数数组banned,它包含数组中的一些位置。banned中第i个位置表示arr[banned[i]]=......
  • ASP.NET MVC5多语言切换快速实现方案
    实现动态切换语言,Demo做了三种语言库可以切换,包括资源文件的定义,实体对象属性设置,后台代码Controller,IAuthorizationFilter,HtmlHelper的实现,做法比较简单易学易用,配合我之前发布的# MVCScaffoldingSmartCode-Engine更新 模板中新增了多语言资源文件的生成功能,发现......
  • Django在dateTime-loca默认展示查询的日期时间
     1、默认展示固定的一个日期时间<inputtype="datetime-local"name="tenderEndTime"value="2022-01-01T18:00"">2、展示后端查询的日期时间html:<inputtype="datetime-local"name="tenderEndTime"value="{{ins......
  • C语言学习记录----函数
    1.函数是什么?数学中我们常见到函数的概念。但是你了解C语言中的函数吗?维基百科中对函数的定义:子程序在计算机科学中,子程序(英语:Subroutine,procedure,function,routine,method,subprogram,callableunit),是一个大型程序中的某部分代码,由一个或多个语句块组成。它负责完......
  • Go学习笔记
    这几天在学Go,记录一下一些困惑和理解channel特性查阅的资料:Go语言channel探究_go多个协程读一个channel_JE_Xie的博客-CSDN博客Go中的channel解析—Go中的并发性-知乎(zhihu.com)Go中的channel_gochannel_始梦的少年的博客-CSDN博客一、channel与blocking和deadlo......