go语言interface接口继承多态示例及定义解析

目录
  • 1.什么是接口
  • 2.接口定义
  • 3.多态
    • 多态加减计算器
  • 4.接口继承与转换
  • 5.空接口
  • 6.接口转换
  • 7.实现map字典接口
  • 8.interface案例

1.什么是接口

接口就是一种规范与标准,在生活中经常见接口,例如:笔记本电脑的USB接口,可以将任何厂商生产的鼠标与键盘,与电脑进行链接。为什么呢?原因就是,USB接口将规范和标准制定好后,各个生产厂商可以按照该标准生产鼠标和键盘就可以了。

在程序开发中,接口只是规定了要做哪些事情,干什么。具体怎么做,接口是不管的。这和生活中接口的案例也很相似,例如:USB接口,只是规定了标准,但是不关心具体鼠标与键盘是怎样按照标准生产的.

在企业开发中,如果一个项目比较庞大,那么就需要一个能理清所有业务的架构师来定义一些主要的接口,这些接口告诉开发人员你需要实现那些功能。

2.接口定义

接口定义的语法如下:

方式一:interface接收任意数据格式
//先定义接口  一般以er结尾  根据接口实现功能
type CurrencyEr2 interface{
	Symbol() string
}

方式二:指定类型
type Currency string

怎样具体实现接口中定义的方法呢?

func (c Currency)Symbol() string {
	m := ""
	switch c {
	case "CNY":
		// 人民币
		m = "¥"
	case "KRW":
		// 韩币
		m = "₩"
	case "TWD":
		// 台币
		m = "$"
	case "JPY":
		// 日元
		m = "¥"
	case "USD":
		// 美元
		m = "$"
	}
	return m
}

具体的调用如下:

func main() {
  // 方式一:
  a:=CurrencyEr2(Currency("CNY")).Symbol()
	fmt.Println(a)
  // 方式二:
	b:=Currency("CNY").Symbol()
	fmt.Println(b)
}

只要类(结构体)实现对应的接口,那么根据该类创建的对象,可以赋值给对应的接口类型。

接口的命名习惯以er结尾。

3.多态

接口有什么好处呢?实现多态。

多态就是同一个接口,使用不同的实例而执行不同操作

所谓多态指的是多种表现形式,如下图所示:

使用接口实现多态的方式如下:

package main
import "fmt"
//先定义接口  一般以er结尾  根据接口实现功能
type CurrencyEr2 interface {
	//方法  方法的声明
	Symbol() string
}
type Currency string
type Currency2 string
func (c Currency) Symbol() string {
	m := ""
	switch c {
	case "CNY":
		m = "¥"
	}
	return m
}
func (c Currency2) Symbol() string {
	m := ""
	switch c {
	case "USD":
		m = "$"
	}
	return m
}
//多态的实现
//将接口作为函数参数  实现多态
func Start(c CurrencyEr2) string {
	return c.Symbol()
}
func main() {
	//调用多态函数
	a := Start(Currency("CNY"))
	fmt.Println(a)
	//调用多态函数
	b := Start(Currency2("USD"))
	fmt.Println(b)
}

多态加减计算器

package main
import "fmt"
//定义接口
type Opter interface {
	//方法声明
	Result() int
}
//父类结构体
type Operate struct {
	num1 int
	num2 int
}
//加法子类结构体
type Add struct {
	Operate
}
//实现加法子类的方法
func (a *Add) Result() int {
	return a.num1 + a.num2
}
//减法子类结构体
type Sub struct {
	Operate
}
//实现减法子类的方法
func (s *Sub) Result() int {
	return s.num1 - s.num2
}
//创建一个类负责对象创建
//工厂类
type Factory struct {
}
func (f *Factory) Result(num1 int, num2 int, ch string) int {
	sum := 0
	switch ch {
	case "+":
		var a Add
		a.num1 = num1
		a.num2 = num2
		sum = Opter.Result(&a)
	case "-":
		var s Sub
		s.num1 = num1
		s.num2 = num2
		sum = Opter.Result(&s)
	}
	return sum
}
//通过设计模式调用
func main() {
	//创建工厂对象
	var f Factory
	a:= f.Result(10, 20, "+")
	fmt.Println(a)
}

4.接口继承与转换

接口也可以实现继承:

package main
import "fmt"
//先定义接口  一般以er结尾  根据接口实现功能
type Humaner2 interface {   //子集
    //方法  方法的声明
    sayhi()
}
type Personer interface {  //超集
    Humaner2   //继承sayhi()

    sing(string)
}
type student13 struct {
    name  string
    age   int
    score int
}
func (s *student13)sayhi()  {
    fmt.Printf("大家好,我是%s,今年%d岁,我的成绩%d分\n",s.name,s.age,s.score)
}
func (s *student13)sing(name string)  {
    fmt.Println("我为大家唱首歌",name)
}
func main() {
    //接口类型变量定义
    var h Humaner2
    var stu student13 = student13{"小吴",18,59}
    h = &stu
    h.sayhi()
    //接口类型变量定义
    var p Personer
    p = &stu
    p.sayhi()
    p.sing("大碗面")
}

接口继承后,可以实现“超集”接口转换“子集”接口,代码如下:

package main
import "fmt"
//先定义接口  一般以er结尾  根据接口实现功能
type Humaner2 interface {   //子集
    //方法  方法的声明
    sayhi()
}
type Personer interface {  //超集
    Humaner2   //继承sayhi()
    sing(string)
}
type student13 struct {
    name  string
    age   int
    score int
}
func (s *student13)sayhi()  {
    fmt.Printf("大家好,我是%s,今年%d岁,我的成绩%d分\n",s.name,s.age,s.score)
}
func (s *student13)sing(name string)  {
    fmt.Println("我为大家唱首歌",name)
}
func main()  {
    //接口类型变量定义
    var h Humaner2  //子集
    var p Personer    //超集
    var stu student13 = student13{"小吴",18,59}
    p = &stu
    //将一个接口赋值给另一个接口
    //超集中包含所有子集的方法
    h = p  //ok
    h.sayhi()
    //子集不包含超集
    //不能将子集赋值给超集
    //p = h  //err
    //p.sayhi()
    //p.sing("大碗面")
}

5.空接口

空接口(interface{})不包含任何的方法,正因为如此,所有的类型都实现了空接口,因此空接口可以存储任意类型的数值。

例如:

var i interface{}
//接口类型可以接收任意类型的数据
//fmt.Println(i)
fmt.Printf("%T\n",i)
i = 10
fmt.Println(i)
fmt.Printf("%T\n",i)

当函数可以接受任意的对象实例时,我们会将其声明为interface{},最典型的例子是标准库fmt中PrintXXX系列的函数,例如:

func Printf(fmt string, args ...interface{})
func Println(args ...interface{})

如果自己定义函数,可以如下:

func Test(arg ...interface{}) {
}

Test( )函数可以接收任意个数,任意类型的参数。

6.接口转换

结论:超集可以转换为子集,子集不可以转换为超集

package main
import "fmt"
type Humaner interface { //子集
	sayhi()
}
type Personer interface { //超集
	Humaner //匿名字段,继承了sayhi()
	sing(lrc string)
}
type Student struct {
	name string
	id   int
}
//Student实现了sayhi()
func (tmp *Student) sayhi() {
	fmt.Printf("Student[%s, %d] sayhi\n", tmp.name, tmp.id)
}
func (tmp *Student) sing(lrc string) {
	fmt.Println("Student在唱着:", lrc)
}
func main() {
	//超集可以转换为子集,反过来不可以
	var iPro Personer //超集
	iPro = &Student{"mike", 666}
	var i Humaner //子集
	//iPro = i //err
	i = iPro //可以,超集可以转换为子集
	i.sayhi()
}

7.实现map字典接口

package main
import (
	"fmt"
	"sync"
)
type UserAges struct {
	ages map[string] int
	sync.Mutex
}
func (u *UserAges)Add(name string,age int)  {
	u.Lock()
	defer u.Unlock()
	u.ages[name] = age
}
func (u *UserAges)Get(name string)int{
	if age,ok:=u.ages[name];ok{
		return age
	}
	return -1
}
func main() {
	dic:=make(map[string]int)
	dic["age"] = 18
	r:=UserAges{ages: dic}
	r.Add("jeff",20)
	fmt.Println(r)
	age:=r.Get("age")
	fmt.Println(age)
}

8.interface案例

package main
import "fmt"
type Bike interface {
	save()
	update()
	insert()
}
type User struct {
	name string
}
func (this *User) save() {
	fmt.Println("保存成功", this.name)
}
func (this *User) update() {
	fmt.Println("更新成功", this.name)
}
func (this *User) insert() {
	fmt.Println("插入成功", this.name)
}
func main() {
	var data Bike = &User{name: "jeff"}
	data.save()
	data.update()
	data.insert()
}

以上就是go语言interface接口继承多态示例及定义解析的详细内容,更多关于go语言interface接口继承多态的资料请关注我们其它相关文章!

(0)

相关推荐

  • 使用go的interface案例实现多态范式操作

    看程序: package main import "fmt" type BaseIntf interface { Process() } type Msg1 struct { req int rsp int } func (p *Msg1) Process() { fmt.Println("process 1") } type Msg2 struct { req int rsp int } func (p *Msg2) Process() { fmt.Println

  • Golang中匿名组合实现伪继承的方法

    "Go语言的面向对象机制与一般语言不同. 它没有类层次结构, 甚至可以说没有类: 仅仅通过组合( 而不是继承) 简单的对象来构建复杂的对象." -- <Go语言圣经> 1.匿名组合 1.1 匿名组合定义 golang中组合语法,就是在一个类中,引入了另一个类,如 type Logger struct{ } type Work struct{ log Logger } type Work2 struct{ log *Logger } func (Logger)Info(v .

  • golang基础之Interface接口的使用

    接口是一个或多个方法签名名的集合,定义方式如下 type Interface_Name interface { method_a() string method_b() int .... } 只要某个类型拥有该接口的所有方法签名,就算实现该接口,无需显示声明实现了那个接口,这称为structural Typing package main import "fmt" type USB interface { //定义一个接口:方法的集合 Name() string //Name方法,返回

  • golang中interface接口的深度解析

    一 接口介绍 如果说gorountine和channel是支撑起Go语言的并发模型的基石,让Go语言在如今集群化与多核化的时代成为一道亮丽的风景,那么接口是Go语言整个类型系列的基石,让Go语言在基础编程哲学的探索上达到前所未有的高度.Go语言在编程哲学上是变革派,而不是改良派.这不是因为Go语言有gorountine和channel,而更重要的是因为Go语言的类型系统,更是因为Go语言的接口.Go语言的编程哲学因为有接口而趋于完美.C++,Java 使用"侵入式"接口,主要表现在实现

  • 浅谈Go语言多态的实现与interface使用

    目录 一.多态的含义 二.抽象类与接口 三.Golang中的接口 四.总结 一.多态的含义 对于Java或者是C++而言,我们在使用变量的时候,变量的类型是明确的.但是如果我们希望它可以宽松一点,比如说我们用父类指针或引用去调用方法,但是在执行的时候,能够根据子类的类型去执行子类当中的方法.也就是说实现我们用相同的调用方式调出不同结果或者是功能的情况,这种情况就叫做多态. 举个非常经典的例子,比如说猫.狗和人都是哺乳动物.这三个类都有一个say方法,大家都知道猫.狗以及人类的say是不一样的,猫

  • 浅谈Go语言中的结构体struct & 接口Interface & 反射

    结构体struct struct 用来自定义复杂数据结构,可以包含多个字段(属性),可以嵌套: go中的struct类型理解为类,可以定义方法,和函数定义有些许区别: struct类型是值类型. struct定义 type User struct { Name string Age int32 mess string } var user User var user1 *User = &User{} var user2 *User = new(User) struct使用 下面示例中user1和

  • Go 通过结构struct实现接口interface的问题

    目录 一.通过结构(struct) 实现 接口(interface) 二.代码示例 一.通过结构(struct) 实现 接口(interface) 1.在了解iris框架的时候,经常看到有这样去写的使用一个空结构体作为接收器,来调用方法,有点好奇这样做有什么意义. 解释:在 Go 语言中,一个 struct 实现了某个接口里的所有方法,就叫做这个 struct 实现了该接口. 2.空结构体有以下几大特点 A.不占用内存地址. B.地址不变 3.首先我们知道interface定义的是抽象方法,而下

  • go语言interface接口继承多态示例及定义解析

    目录 1.什么是接口 2.接口定义 3.多态 多态加减计算器 4.接口继承与转换 5.空接口 6.接口转换 7.实现map字典接口 8.interface案例 1.什么是接口 接口就是一种规范与标准,在生活中经常见接口,例如:笔记本电脑的USB接口,可以将任何厂商生产的鼠标与键盘,与电脑进行链接.为什么呢?原因就是,USB接口将规范和标准制定好后,各个生产厂商可以按照该标准生产鼠标和键盘就可以了. 在程序开发中,接口只是规定了要做哪些事情,干什么.具体怎么做,接口是不管的.这和生活中接口的案例也

  • JavaScript使用prototype原型实现的封装继承多态示例

    本文实例讲述了JavaScript使用prototype原型实现的封装继承多态.分享给大家供大家参考,具体如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml&

  • C语言模拟实现C++的继承与多态示例

    一.面向过程编程与面向对象编程的区别 众所周知,C语言是一种典型的面向过程编程语言,而C++确实在它的基础上改进的一款面向对象编程语言,那么,面向过程与面向对象到底有什么样的区别呢? [从设计方法角度看] 面向过程程序设计方法采用函数(或过程)来描述对数据的操作,但又将函数与其操作的数据分离开来. 面向对象程序设计方法是将数据和对象的操作封装在一起,作为一个整体来处理. [从维护角度看] 面向过程程序设计以过程为中心,难于维护. 面向对象程序设计以数据为中心,数据相对功能而言,有较强的稳定性,因

  • java用接口、多态、继承、类计算三角形和矩形周长及面积的方法

    本文实例讲述了java用接口.多态.继承.类计算三角形和矩形周长及面积的方法.分享给大家供大家参考.具体如下: 定义接口规范: /** * @author vvv * @date 2013-8-10 上午08:56:48 */ package com.duotai; /** * * */ public interface Shape { public double area(); public double longer(); } /** * @author vvv * @date 2013-8

  • Mybatis TypeHandler接口及继承关系示例解析

    目录 开篇 TypeHandler接口 TypeHandler继承体系 IntegerTypeHandler DateTypeHandler TypeHandlerRegistry TypeHandlerRegistry#register方法 总结 开篇 JDBC类型与Java类型并不是完全一一对应的.所以在PreparedStatement绑定参数的时候需要把Java类型转为JDBC类型.JDBC类型的枚举值在JdbcType枚举值中存储. MyBatis中提供了一个接口专用于JDBC类型与J

  • Java接口继承和使用接口操作示例

    本文实例讲述了Java接口继承和使用接口操作.分享给大家供大家参考,具体如下: 一 接口的继承 1 点睛 接口支持多继承,一个接口可以有多个父接口,子接口扩展某个父接口,将会获得父接口里定义的所有抽象方法.常量. 一个接口继承多个父接口时,多个父接口排在extends关键字之后. 2 代码 interface interfaceA { int PROP_A = 5; void testA(); } interface interfaceB { int PROP_B = 6; void testB

  • Python面向对象封装继承和多态示例讲解

    面向对象的三大特征:封装,继承,多态 1.封装: 提高程序的安全性 将数据(属性)和行为(方法)包装到类对象中,在方法内部对属性进行对象的外部调用方法. 这样无需关心内部的具体实现. 在python中没有专门的修饰符用于属性的私有,如果属性不希望被访问,前面使用两个下划线 2.继承: 提高代码的复用性 3.提高程序的可拓展性和可 维护性. 1. 封装 我们来看看私有方式的使用: # 作者:互联网老辛 # 开发时间:2021/4/4/0004 22:11 class Student: def __

  • go语言beego框架分页器操作及接口频率限制示例

    目录 获取所有文章数据 获取总条数 设置每页的条数 总页数和当前页码 获取分页数据 返回数据 beego接口频率限制 获取所有文章数据 o := orm.NewOrm() qs := o.QueryTable("Article") 12 获取总条数 count, _ := qs.Count() 1 设置每页的条数 pageSetNum := 2 1 总页数和当前页码 // 总页数 pageCount := math.Ceil((float64(count) / float64(page

  • 一篇文章带你玩转go语言的接口

    目录 一.其他语言 二.go语言 三.go接口实现多态 四.空接口的使用(重点) 4.1定义 4.2空接口使用 4.3空接口几个要注意的坑(我刚学时的错误) 总结 一.其他语言 其他语言中所提供的接口概念:接口主要作为不同组件之间的契约存在.对契约的实现是强制的(侵入式接口),你必须声明你的确实现了该接口.为了实现一个接口,你需要从该接口继承. interface IFoo { void Bar(); } // Java文法 // ... class Foo implements IFoo {

随机推荐