Go学习笔记-接口(interface)的实现

对于go的接口,我们先来看看官方的解释

接口是用来定义行为的类型。这些被定义的行为不由接口直接实现,而是通过方法由用户定义的类型实现。如果用户定义的类型实现了某个接口类型声明的一组方法,那么这个用户定义的类型的值就可以赋给这个接口类型的值。这个赋值会把用户定义的类型的值存入接口类型的值

也就是说接口定义的方法,需要由具体的类型去实现它。

下面我们来看看接口的实现
在go语言中,接口的实现与struct的继承一样,不需要通过某个关键字php:implements来声明。在go中一个类只要实现了某个接口要求的所有方法,我们就说这个类实现了该接口。下面来看一个例子
type NoticeInterface interface {  
   seedEmail()  
   seedSMS()  
}  
  
type Student struct {  
   Name string  
  Email string  
  Phone string  
}  
  
func (Student *Student)seedEmail()  {  
   fmt.Printf("seedEmail to %s\r\n",Student.Email)  
}  
  
func (Student *Student)seedSMS()  {  
   fmt.Printf("seedSMS to %s\r\n",Student.Email)  
}

这里我们就说 student实现了 NoticeInterface接口。下面来看看接口的调用是否成功

func main()  {  
   student := Student{"andy","jiumengfadian@live.com","10086"}  
   //seedNotice(student)  //这里会产生一个错误
   seedNotice(&student)  
}  
  
//创建一个seedNotice方法,需要接受一个实现了`NoticeInterface`类型  
func seedNotice(notice NoticeInterface)  {  
   notice.seedEmail()  
   notice.seedSMS()  
}

在上面的例子中,我们创建了一个seedNotice需要接受一个实现了NoticeInterface的类型。但是我在main中第一个调用该方法的时候,传入了一个student值。这个时候会产生一个错误

.\main.go:26:12: cannot use student (type Student) as type NoticeInterface in argument to seedNotice:
    Student does not implement NoticeInterface (seedEmail method has pointer receiver)

意思是student没有实现NoticeInterface不能作为NoticeInterface的类型参数。为什么会有这样的错误呢?我们在来看看上面的

func (Student *Student)seedEmail()  {  
   fmt.Printf("seedEmail to %s\r\n",Student.Email)  
}  
  
func (Student *Student)seedSMS()  {  
   fmt.Printf("seedSMS to %s\r\n",Student.Email)  
}

这里我们对seedEmail,seedSMS的实现都是对于*Student也就是student的地址类型的,
所以我们这也就必须传入一个student的指针seedNotice(&student)
这里给出一个规范中的方法集描述

method receivers values
(t T) T and *T
(t *T) t *T
描述中说到,T 类型的值的方法集只包含值接收者声明的方法。而指向 T 类型的指针的方法集既包含值接收者声明的方法,也包含指针接收者声明的方法. 也就是说 如果方法集使用的是指针类型,那么我们必须传入指针类型的值,如果方法集使用的是指类型,那么我们既可以传入值类型也可以传入指针类型
期待一起交流

短腿子猿


逸梦
一个PHP程序猿的文章栏目

PHP、Golang

678 声望
76 粉丝
0 条评论
推荐阅读
Golang Recover提高程序的健壮性
在GO语言中goroutine的开启是很方便的只需要一个关键词go func() 就可以开启一个协程。但是在协程中我们可能会遇到一些致命的错误,如果这个时候我们没有对这个错误进行处理,那么整个程序就会崩溃。而在Go中为解...

旧梦发癫阅读 4.5k

golang学习之旅——解开心中的go mod疑惑
在go1.16版本发布后,go module由原来的默认值 auto 变为 on 了,这意味着后续开发中,go更推荐用go module 模式开发,而不是gopath模式开发了。

Keson11阅读 14.8k

「刷起来」Go必看的进阶面试题详解
逃逸分析是Go语言中的一项重要优化技术,可以帮助程序减少内存分配和垃圾回收的开销,从而提高程序的性能。下面是一道涉及逃逸分析的面试题及其详解。

王中阳Go4阅读 1.9k评论 1

封面图
初学后端,如何做好表结构设计?
这篇文章介绍了设计数据库表结构应该考虑的4个方面,还有优雅设计的6个原则,举了一个例子分享了我的设计思路,为了提高性能我们也要从多方面考虑缓存问题。

王中阳Go4阅读 1.7k评论 2

封面图
滚蛋吧,正则表达式!
你是不是也有这样的操作,比如你需要使用「电子邮箱正则表达式」,首先想到的就是直接百度上搜索一个,然后采用 CV 大法神奇地接入到你的代码中?

良许4阅读 2.3k

又一款眼前一亮的Linux终端工具!
今天给大家介绍一款最近发现的功能十分强大,颜值非常高的一款终端工具。这个神器我是在其他公众号文章上看到的,但他们都没把它的强大之处介绍明白,所以我自己体验一波后,再向大家分享自己的体验。

良许5阅读 1.8k

一分钟搞明白!快速掌握 Go WebAssembly
最近因为各种奇怪的原因,更多的接触到了 WebAssembly。虽然之前很多博客也翻过写过各种文章,但总感觉欠些味道。于是今天梳理了一版,和大家一起展开学习。

煎鱼4阅读 2.1k

PHP、Golang

678 声望
76 粉丝
宣传栏