文档章节

Go接口的实现

秋风醉了
 秋风醉了
发布于 2016/10/08 16:04
字数 690
阅读 26
收藏 0

Go接口的实现

接口

Go 语言中的接口很特别,而且提供了难以置信的一系列灵活性和抽象性。它们指定一个特定类型的值和指针表现为特定的方式。从语言角度看,接口是一种类型,它指定一个方法集。

下面定义一个接口:

type Notifier interface {
	Notify() error
}

我们定义了一个叫做 Notifier 的接口并包含一个 Notify 方法。当一个接口只包含一个方法时,按照 Go 语言的约定命名该接口时添加 -er 后缀。这个约定很有用,特别是接口和方法具有相同名字和意义的时候。

我们可以在接口中定义尽可能多的方法,不过在 Go 语言标准库中,你很难找到一个接口包含两个以上的方法。

实现接口

当涉及到该怎么让我们的类型实现接口时,Go 语言是特别的一个。Go 语言不需要我们显式的实现类型的接口。如果一个接口里的所有方法都被我们的类型实现了,那么我们就说该类型实现了该接口。

定义一个函数来接受任意一个实现了接口 Notifier 的类型的值或者指针:

package main

import "log"

type Notifier interface {
	Notify() error
}

type User struct {
	Name  string
	Email string
}

func (u *User) Notify() error {
	log.Printf("User: Sending User Email To %s<%s>\n", u.Name, u.Email)
	return nil
}

func SendNotification(notify Notifier) error {
	return notify.Notify()
}

func main() {
	user := User{
		Name:  "AriesDevil",
		Email: "ariesdevil@xxoo.com",
	}

	/**
	这两种调用方式是等价的
	 */
	user.Notify() //语法糖,等价于下面的调用方式
	(&user).Notify()

	//但在这里的调用就会出错,这是因为:类型 T 不拥有接收器 *T 的方法
	SendNotification(user)
}

报错如下,

hello/main.go:31: cannot use user (type User) as type Notifier in argument to SendNotification:
	User does not implement Notifier (Notify method has pointer receiver)
类型 T 的可调用方法集包含接收器为 T 的所有方法,也可以说 T 类型不拥有接收器为 *T 的方法

在这里,Notify 方法使用指针类型作为接收器而我们却通过值类型来调用该方法。解决办法也很简单,我们只需要传入 User 值的地址到 SendNotification 函数就好了:

SendNotification(&user)

相反的是:

类型 *T 的可调用方法集包含接收器为 *T 或 T 的所有方法

如下方式是能够编译通过的,

package main

import "log"

type Notifier interface {
	Notify() error
}

type User struct {
	Name  string
	Email string
}

func (u User) Notify() error {
	log.Printf("User: Sending User Email To %s<%s>\n", u.Name, u.Email)
	return nil
}

func SendNotification(notify Notifier) error {
	return notify.Notify()
}

func main() {
	user := User{
		Name:  "AriesDevil",
		Email: "ariesdevil@xxoo.com",
	}

	/**
	这两种调用方式是等价的
	 */
	user.Notify()
	(&user).Notify()

	SendNotification(&user)
} 

=========END=========

© 著作权归作者所有

共有 人打赏支持
秋风醉了
粉丝 232
博文 574
码字总数 405033
作品 0
朝阳
程序员
认真CS丨显式接口 & 隐式接口

接口 隐式实现接口 using System; class a{ } 在此代码中,我们不知道C为IA的实现,还是IB的实现,因此需要显式实现接口 显式实现接口 隐式接口实现,即没有指定实现哪个接口方法。显式的接口...

weixin_38239050
04/30
0
0
Golang面向接口编程

1. 接口[多态] 多态性(polymorphisn)是允许你将父对象设置成为和一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。 简而言之,...

huwh_
01/13
0
0
C# 接口的隐式与显示实现

以前在用到接口时,从来没注意到接口分为隐式实现与显示实现。昨天在浏览博客时看到相关内容,现在根据自己的理解记录一下,方便日后碰到的时候温习温习。    通俗的来讲,“显示接口实现”...

robortly
2015/09/11
46
0
Java篇-接口interface关键字

一 : interface关键字 接口是与类并行的一个概念 Java接口是一系列方法的声明,是一些方法特征的集合,一个接口只有方法的特征没有方法的实现,因此这些方法可以在不同的地方被不同的类实现,...

TianTianBaby223
04/24
0
0
接口的实现方式(显示和隐示)及协变和逆变

接口的实现方式(显示和隐示)及协变和逆变 如果一个类继承了两个不同的接口,且这两个接口有一样的成员,类实例任意调用I1,I2接口: 如: 这时i1.GetSome()的输出就是"I1.Some",i2.GetSom...

JoeSnail
2017/01/11
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

流量劫持是如何产生的?

流量劫持,这种古老的攻击沉寂了一段时间后,最近又开始闹的沸沸扬扬。众多知名品牌的路由器相继爆出存在安全漏洞,引来国内媒体纷纷报道。只要用户没改默认密码,打开一个网页甚至帖子,路由...

谢思华
17分钟前
0
0
Hadoop Client无法使用maven下载源码

最近在学习hadoop,使用maven的时候想看一下源码的注释,结果IDEA一直提示无法下载 搞得我一度以为maven坏掉了。 但是通过搜索,发现在maven仓库里确实没有源码.... 而2.8.1以及之前的版本是...

Iceberg_XTY
18分钟前
0
0
为什么程序员千万不要重写代码?

你所做的事情,也许暂时看不到成果,但不要灰心或焦虑,你不是没有成长,而是在扎根。 图片来自网络 0 前言 程序员都有一颗工程师的心,所以当他们到一片新的场地想做的第一件事就是,将旧的...

Java小铺
20分钟前
0
0
VUE集成AdminLte

1. 安装需要到插件 npm i admin-lte -Snpm i jquery -Snpm i axios -Snpm i vue-router -S 2. 配置webpack.config.js 2.1 module.exports.module.rules修改字体loader: {test: /\.(p......

Pasenger
58分钟前
0
0
Spring Aop原理之切点表达式解析

在前面的文章(Spring AOP切点表达式详解)中,我们总结了Spring Aop切点表达式的用法,而在上文(Spring Aop原理之Advisor过滤)中我们讲到,切点表达式的解析主要是在PatternParser.parse...

爱宝贝丶
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部