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语言中的UTF-8实现
Apr 26 Golang
go设置多个GOPATH的方式
May 05 Golang
Go 自定义package包设置与导入操作
May 06 Golang
go 实现简易端口扫描的示例
May 22 Golang
基于Go语言构建RESTful API服务
Jul 25 Golang
如何利用golang运用mysql数据库
Mar 13 Golang
golang用type-switch判断interface的实际存储类型
Apr 14 Golang
Golang获取List列表元素的四种方式
Apr 20 Golang
Golang解析JSON对象
Apr 30 Golang
Go中使用gjson来操作JSON数据的实现
Aug 14 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
php 更新数据库中断的解决方法
2009/06/05 PHP
php上传图片之时间戳命名(保存路径)
2014/08/15 PHP
PHP程序中的文件锁、互斥锁、读写锁使用技巧解析
2016/03/21 PHP
如何使用PHP给图片加水印
2016/10/12 PHP
PHP数据的提交与过滤基本操作实例详解
2016/11/11 PHP
javascript表单验证 - Parsley.js使用和配置
2013/01/25 Javascript
jQuery Ajax()方法使用指南
2014/11/19 Javascript
使用 TypeScript 重新编写的 JavaScript 坦克大战游戏代码
2015/04/07 Javascript
使用grunt合并压缩js和css文件的方法
2017/03/02 Javascript
微信小程序实现锚点定位楼层跳跃的实例
2017/05/18 Javascript
JS简单实现自定义右键菜单实例
2017/05/31 Javascript
CKEditor4配置与开发详细中文说明文档
2018/10/08 Javascript
35个最好用的Vue开源库(史上最全)
2019/01/03 Javascript
微信小程序如何调用新闻接口实现列表循环
2019/07/02 Javascript
JavaScript 接口原理与用法实例详解
2020/05/12 Javascript
JS forEach跳出循环2种实现方法
2020/06/24 Javascript
python中from module import * 的一个坑
2014/07/20 Python
Python导入txt数据到mysql的方法
2015/04/08 Python
深入理解python中的浅拷贝和深拷贝
2016/05/30 Python
Python标准库sched模块使用指南
2017/07/06 Python
django 解决manage.py migrate无效的问题
2018/05/27 Python
Python3.7中安装openCV库的方法
2018/07/11 Python
Python定义函数功能与用法实例详解
2019/04/08 Python
PyQt4编程之让状态栏显示信息的方法
2019/06/18 Python
python用线性回归预测股票价格的实现代码
2019/09/04 Python
Python定义函数时参数有默认值问题解决
2019/12/19 Python
python自动脚本的pyautogui入门学习
2020/04/01 Python
HTML5本地存储之Web Storage应用介绍
2013/01/06 HTML / CSS
中国最大的团购网站:聚划算
2016/09/21 全球购物
澳大利亚小众服装品牌:Maurie & Eve
2018/03/27 全球购物
美国农场商店:Blain’s Farm & Fleet
2020/01/17 全球购物
学生就业推荐信
2013/11/13 职场文书
教师敬业奉献模范事迹材料
2014/05/18 职场文书
地质工程专业毕业生求职信
2014/08/08 职场文书
大学生自我评价200字(4篇)
2014/09/17 职场文书
党员自我剖析材料范文
2014/10/06 职场文书