Go接口的实现
Go接口的实现
秋风醉了 发表于1年前
Go接口的实现
  • 发表于 1年前
  • 阅读 25
  • 收藏 0
  • 点赞 0
  • 评论 0

腾讯云 十分钟定制你的第一个小程序>>>   

摘要: Go接口的实现

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

共有 人打赏支持
粉丝 214
博文 604
码字总数 437214
×
秋风醉了
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: