Go 通过结构struct实现接口interface的问题


Posted in Golang onOctober 05, 2021

一、通过结构(struct) 实现 接口(interface)

1、在了解iris框架的时候,经常看到有这样去写的使用一个空结构体作为接收器,来调用方法,有点好奇这样做有什么意义。

解释:在 Go 语言中,一个 struct 实现了某个接口里的所有方法,就叫做这个 struct 实现了该接口。

2、空结构体有以下几大特点

A、不占用内存地址。

B、地址不变

3、首先我们知道interface定义的是抽象方法,而下面的func是它的具体实现(这个和java差不多的意思),但是我们知道,在java中interface是没有办法实例化,因为他是抽象的。那么这个操作的作用是:首先NewEntraceRepository这个方法返回了一个空结构体的指针(该空结构体必须实现了当前interface),然后我们只要使用NewEntraceRepository创建的变量就可以直接调用当前interface的方法。

func NewEntraceRepository()EntraceRepository {
    return &entraceRepository{};
}

上面这段代码相当于下面

var variable_value  EntraceRepository=&entraceRepository{} 

疑问:为什么可以将这个空结构体赋值给interface,我们知道只有结构体实现了interface的所有方法才能这样进行赋值。

func (n bookRepository) GetBookList(m map[string]interface{})(total int,books []models.Book){}

其实一个 struct 实现了某个接口里的所有方法,就叫做这个 struct 实现了该接口。所以使用一个变量接收这个地址是可以直接调用的。

下面写一个 Demo 实现一下,先写一个 Study interface{},里面需要实现 4 个方法 Listen、Speak、Read、Write,然后再写一个 study struct{},去全部实现里面的方法,然后分享一下代码心得。

二、代码示例

//Go - 结构(struct) 实现 接口(interface)
 
package main
 
import (
    "fmt"
 
    "github.com/pkg/errors"
)
 
var _ Study = (*study)(nil)
 
type Study interface {
    Listen(msg string) string
    Speak(msg string) string
    Read(msg string) string
    Write(msg string) string
}
 
type study struct {
    Name string
}
 
func (s *study) Listen(msg string) string {
    return s.Name + " 听 " + msg
}
 
func (s *study) Speak(msg string) string {
    return s.Name + " 说 " + msg
}
 
func (s *study) Read(msg string) string {
    return s.Name + " 读 " + msg
}
 
func (s *study) Write(msg string) string {
    return s.Name + " 写 " + msg
}
 
func New(name string) (Study, error) {
    if name == "" {
        return nil, errors.New("name required")
    }
 
    return &study{
        Name: name,
    }, nil
}
 
func main() {
    name := "Xiao Ming "
    s, err := New(name)
    if err != nil {
        fmt.Println(err)
    }
 
    fmt.Println(s.Listen("english"))
    fmt.Println(s.Speak("english"))
    fmt.Println(s.Read("english"))
    fmt.Println(s.Write("english"))
}

到此这篇关于Go 通过结构(struct) 实现接口(interface)的文章就介绍到这了,更多相关Go 结构实现接口内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Golang 相关文章推荐
Go Gin实现文件上传下载的示例代码
Apr 02 Golang
基于go interface{}==nil 的几种坑及原理分析
Apr 24 Golang
Golang 空map和未初始化map的注意事项说明
Apr 29 Golang
Go标准容器之Ring的使用说明
May 05 Golang
Golang实现AES对称加密的过程详解
May 20 Golang
go web 预防跨站脚本的实现方式
Jun 11 Golang
Go语言读取txt文档的操作方法
Jan 22 Golang
如何解决goland,idea全局搜索快捷键失效问题
Apr 03 Golang
golang语言指针操作
Apr 14 Golang
Golang 入门 之url 包
May 04 Golang
Golang入门之计时器
May 04 Golang
Go gRPC进阶教程gRPC转换HTTP
Jun 16 Golang
golang实现一个简单的websocket聊天室功能
深入理解go slice结构
Sep 15 #Golang
Golang表示枚举类型的详细讲解
golang 语言中错误处理机制
Aug 30 #Golang
Golang并发操作中常见的读写锁详析
Aug 30 #Golang
Go中的条件语句Switch示例详解
Aug 23 #Golang
Go Plugins插件的实现方式
Aug 07 #Golang
You might like
提问的智慧
2006/10/09 PHP
Yii2中Restful API原理实例分析
2016/07/25 PHP
php arsort 数组降序排序详细介绍
2016/11/17 PHP
如何用javascript判断录入的日期是否合法
2007/01/08 Javascript
在textarea中屏蔽js的某个function的javascript代码
2007/04/20 Javascript
JQuery中each()的使用方法说明
2010/08/19 Javascript
基于jquery的防止大图片撑破页面的实现代码(立即缩放)
2011/10/24 Javascript
jquery Moblie入门—hello world的示例代码学习
2013/01/08 Javascript
js实现上传图片之上传前预览图片
2013/03/25 Javascript
JS网页图片按比例自适应缩放实现方法
2014/01/15 Javascript
javascript对JSON数据排序的3个例子
2014/04/12 Javascript
JavaScript字符串对象substr方法入门实例(用于截取字符串)
2014/10/16 Javascript
基于jQuery实现表单提交验证
2014/11/24 Javascript
基于AngularJS前端云组件最佳实践
2016/10/20 Javascript
jQuery实现两列等高并自适应高度
2016/12/22 Javascript
bootstrap table之通用方法( 时间控件,导出,动态下拉框, 表单验证 ,选中与获取信息)代码分享
2017/01/24 Javascript
Angularjs2不同组件间的通信实例代码
2017/05/06 Javascript
微信小程序学习之数据处理详解
2017/07/05 Javascript
js实现会跳动的日历效果(完整实例)
2017/10/18 Javascript
JavaScript图片处理与合成总结
2018/03/04 Javascript
Python封装shell命令实例分析
2015/05/05 Python
python中私有函数调用方法解密
2016/04/29 Python
理解Python中的绝对路径和相对路径
2017/08/30 Python
Python通过命令开启http.server服务器的方法
2017/11/04 Python
python爬虫中get和post方法介绍以及cookie作用
2018/02/08 Python
python dataframe astype 字段类型转换方法
2018/04/11 Python
Sanic框架异常处理与中间件操作实例分析
2018/07/16 Python
python对csv文件追加写入列的方法
2019/08/01 Python
Django解决frame拒绝问题的方法
2020/12/18 Python
澳大利亚便宜的家庭购物网站:CrazySales
2018/02/06 全球购物
如何利用find命令查找文件
2016/11/18 面试题
致百米运动员广播稿
2014/01/29 职场文书
孝敬父母的演讲稿
2014/05/14 职场文书
电子信息工程自荐信
2014/05/26 职场文书
导游词怎么写
2015/02/04 职场文书
合作合同协议书
2016/03/21 职场文书