GoLang实现接口的方式

news/2024/11/28 3:36:10/

接口的实现

如果接口类型只包含一个方法,那么这个类型的名字以er结尾。
golang中实现接口的方式:
• 结构体形式实现结构

type Duck interface{Swim()Quack()
}type Person struct{}func (p Person) Swim(){fmt.Println("游泳")
}
func (p Person) Quack(){fmt.Println("鸭子叫")
}

• 结构体指针实现接口

type Handler interface {ServerHTTP(ResponseWriter, *Request)
}type ServeMux struct {}func (mux *ServeMux) ServeHTTP( w ResponseWriter, r *Request) {// 具体的实现
}

• 函数实现接口

type Handler interface {ServerHTTP(ResponseWriter, *Request)
}type HandlerFunc func(ResponseWriter, *Request)func (f HandlerFunc) ServeHTTP(w ResponseWriter, r *Request) {// 具体的实现
}

探讨下调用接口的情况:

如下实现接口:

package mainimport "fmt"type Matcher interface {Search(searchTerm string) (string, error)
}// 实现这个接口
type rssMatcher struct{}func (r rssMatcher) Search(searchTerm string) (string, error){fmt.Println(searchTerm)return searchTerm, nil
}

它的调用方式有4种:

func main()  {var dm0 rssMatcher//指针来调用dm1 :=new(rssMatcher)dm1.Search("test1")//值来调用var dm2 rssMatcherdm2.Search("test2")// 将值传给接口var dm4 Matcher = dm0dm4.Search("test3")// 将指针 传给接口var dm5 Matcher = &dm0dm5.Search("test4")
}

如果改成指针作为接收者:

package mainimport "fmt"type Matcher interface {Search(searchTerm string) (string, error)
}// 实现这个接口
type rssMatcher struct{}func (r *rssMatcher) Search(searchTerm string) (string, error){fmt.Println(searchTerm)return searchTerm, nil
}func main()  {var dm0 rssMatcher//指针来调用dm1 :=new(rssMatcher)dm1.Search("test1")//值来调用var dm2 rssMatcherdm2.Search("test2")// 将值传给接口 Cannot use 'dm0' (type rssMatcher) as type Matcher Type does not implement 'Matcher' as 'Search' method has a pointer receivervar dm4 Matcher = dm0dm4.Search("test3")// 将指针 传给接口var dm5 Matcher = &dm0dm5.Search("test4")
}

调用方式变成了三种, 其中将值赋值给接口的方式会编译出错。
现象:

  • 如果用值作为方法的接收者,编译器会隐式的转换成指针去调用方法。这样无论传给接口类型的是值还是指针都没有问题。
    但是如果用指针作为方法的接收者,在将值传给接口类型的时候,会提示该值没有实现这个接口。

总结:

  • 赋值的时候类型不匹配,说明接口的接收者类型必须要小于等于定义的类型
  • 假设指针为子类型,值的情况为父类型:
    • 那么接收者定义为值就可以用指针和值来赋值。
    • 那么接收者定义为指针就不能用值来赋值。

http://www.ppmy.cn/news/155735.html

相关文章

DMR基础

一、概述 DMR数字对讲机协议是欧洲电信标准协会在2005年4月推出的数字对讲机标准,后来又进行了多次修改。最新版本DMR数字对讲机协议是2007年12月公布的,共有四部分:第一部分为空中接口物理层和数据链路层协议,第二部分为空中接口…

DMA详解

DMA本来不属于CPU体系架构部分的内容,只因为在开发中经常要用到其相关的知识,所以这里就其基本概念、工作原理、常见问题做一个总结。 DMA概述 DMA的英文拼写是“Direct Memory Access”,汉语的意思就是直接内存访问。DMA既可以指内存和外设…

DM8-JDBC

DM8-JDBC 1、对象说明 DriverManager:用于加载驱动和创建数据库连接,实际中采用Class.forName("")来加载驱动,DriverManager用来创建与数据库的连接对象Connection。 URL: 常用数据库URL地址的写法: Oracle写法&…

dm-v1.0.5使用

DM使用V1.0.5版本,线上共创建了100的WORKER任务,给业务做各种数据同步任务,目前官方支持的几种同步方式都在线上运行,且使用超过6个月时间,挺稳定的,高峰期存在一定延期及其他。 使用过程需要注意的有: …

DM8的安装

1.dm8安装 1).通过xftp 把dm8的包放到linux系统下面 2).挂在到mnt文件夹下面 mount /opt/dm8_20210818_x86_rh6_64_ent_8.4.2.18_pack14.iso /mnt 3).创建用户和用户组 groupadd dinstall ---用户组 useradd -g dinstall dmdba ----用户 …

DM到DM的DMHS同步

目录 1 DM源端 1.1 数据库环境准备 1.1.1 开归档和逻辑日志 1.1.2 配置归档 1.1.3 验证配置正确性 1.2 DMHS环境 1.2.1 DMHS安装 1.2.2 DDL同步 1.2.3 配置dmhs.hs 2 目的端 2.1 数据库环境准备 2.1.1 开归档和逻辑日志 2.1.2 配置归档 …

DM8-disql

文章目录 1. 功能介绍2. 启动disql2.1 Windows启动2.1.1 程序菜单启动2.1.2 自带disql启动2.1.3 命令行启动 2.2 Linux启动2.3 disql参数2.3.1 使用disql执行脚本2.3.2 执行SQL语句2.3.3 执行SET语句 3. 密码中存在特殊符号的书写规范3.1 不同的操作系统3.1.1 Windows系统3.1.2…

DMA 讲解

DMA 全称Direct Memory Access,即直接存储器访问。 DMA传输将数据从一个地址止空问复制到6个地经间当CPU书始化这个传输动作,传输动作本身是由DMA控制器来实现和完成的。 DMA传输方式无需CPU直接控制传输,也没有中断处理方式那样保留现场和恢复现场过程,通过硬件为RAM和IO设备…