文档章节

Go接口的实现

秋风醉了
 秋风醉了
发布于 2016/10/08 16:04
字数 690
阅读 27
收藏 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=========

© 著作权归作者所有

共有 人打赏支持
秋风醉了
粉丝 239
博文 572
码字总数 416654
作品 0
朝阳
程序员
私信 提问
认真CS丨显式接口 & 隐式接口

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

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

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

robortly
2015/09/11
46
0
Java8新特性:接口静态方法与默认方法

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

键走偏锋
08/05
0
0
从零开始学Kotlin-使用接口(7)

从零开始学Kotlin基础篇系列文章 定义接口 使用关键字interface定义接口 类或对象可以实现一个或者多个接口 接口中定义属性 接口中的属性只能是抽象的,不允许初始化值 类实现接口的属性:接...

SiberianDante
01/27
0
0
Go语言之接口

接口是一种约定,它是一个抽象的类型,和我们见到的具体的类型如int、map、slice等不一样。具体的类型,我们可以知道它是什么,并且可以知道可以用它做什么;但是接口不一样,接口是抽象的,...

1334293828193662
2017/05/02
0
0

没有更多内容

加载失败,请刷新页面

加载更多

新手也能看懂,消息队列其实很简单

该文已加入开源项目:JavaGuide(一份涵盖大部分Java程序员所需要掌握的核心知识的文档类项目,Star 数接近 16k)。地址:https://github.com/Snailclimb/JavaGuide. 本文内容思维导图: 消息...

阿里云官方博客
14分钟前
0
0
如何在Chrome浏览器中启动deviceready事件(尝试调试phonegap项目)?

我正在开发PhoneGap应用程序,我希望能够在Chrome中调试它,而不是在电话上调试。但是,我在onGetReady()函数中初始化我的代码,该函数在PhoneGap触发“deviceready”事件时触发。由于Chr...

kisshua
今天
9
0
nginx中部署vue打包后的静态文件

如何在nginx中部署静态资源就不描述了, 请看我的这篇博客 将vue脚手架项目打包后的静态文件放到nginx上, 发现有个问题, 即url上有#, 怎么去掉这个#呢. 1 项目中router的mode 路由的mode要为h...

克虏伯
今天
13
0
JS容易理解错误的地方

在这端代码执行的末尾,你会不会hi变量回事函数中的hi了?你会不会认为这不是按引用传递了? 对值传递和引用传递产生质疑了? 1 var hi = {};2 function sayHello(hi) { ...

器石_
今天
9
0
Java开发学习--MongoDB

之前只学过sql,第一次使用非关系型数据库。以前对于关系型数据库与非关系型数据库的概念很模糊,通过这次的学习对这两者有了一个清晰的概念。 主键 在MongoDB中,主键名叫"_id",如果在生成...

微笑向暖wx
今天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部