文档章节

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=========

© 著作权归作者所有

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

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

weixin_38239050
04/30
0
0
C# 接口的隐式与显示实现

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

robortly
2015/09/11
46
0
Golang面向接口编程

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

huwh_
01/13
0
0
接口的实现方式(显示和隐示)及协变和逆变

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

JoeSnail
2017/01/11
0
0
Java8新特性:接口静态方法与默认方法

Java8新特性:接口静态方法与默认方法 Java8新特性:函数式接口@FunctionalInterface使用说明 Java8新特性:方法引用 Java8新特性:函数式编程 在JDK8之前,Interface之中是可以定义变量和方法的...

键走偏锋
08/05
0
0

没有更多内容

加载失败,请刷新页面

加载更多

初级开发-编程题

` public static void main(String[] args) { System.out.println(changeStrToUpperCase("user_name_abc")); System.out.println(changeStrToLowerCase(changeStrToUpperCase("user_name_abc......

小池仔
25分钟前
0
0
现场看路演了!

HiBlock
昨天
4
0
Rabbit MQ基本概念介绍

RabbitMQ介绍 • RabbitMQ是一个消息中间件,是一个很好用的消息队列框架。 • ConnectionFactory、Connection、Channel都是RabbitMQ对外提供的API中最基本的对象。Connection是RabbitMQ的s...

寰宇01
昨天
4
0
官方精简版Windows10:微软自己都看不过去了

微软宣布,该公司正在寻求解决方案,以减轻企业客户的Windows 10规模。该公司声称,企业客户下载整个Windows 10文件以更新设备既费钱又费时。 微软宣布,该公司正在寻求解决方案,以减轻企业...

linux-tao
昨天
4
0
TypeScript基础入门之JSX(二)

转发 TypeScript基础入门之JSX(二) 属性类型检查 键入检查属性的第一步是确定元素属性类型。 内在元素和基于价值的元素之间略有不同。 对于内部元素,它是JSX.IntrinsicElements上的属性类型...

durban
昨天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部