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项目中使用init()
Apr 12 Golang
go语言-在mac下brew升级golang
Apr 25 Golang
golang 实现菜单树的生成方式
Apr 28 Golang
Golang 使用Map实现去重与set的功能操作
Apr 29 Golang
Goland使用Go Modules创建/管理项目的操作
May 06 Golang
聊聊golang中多个defer的执行顺序
May 08 Golang
golang中字符串MD5生成方式总结
Jul 04 Golang
使用GO语言实现Mysql数据库CURD的简单示例
Aug 07 Golang
Go语言读取txt文档的操作方法
Jan 22 Golang
Golang 并发下的问题定位及解决方案
Mar 16 Golang
GoFrame框架数据校验之校验结果Error接口对象
Jun 21 Golang
GO中sync包自由控制并发示例详解
Aug 05 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
php 多个submit提交表单 处理方法
2009/07/07 PHP
PHP+Ajax检测用户名或邮件注册时是否已经存在实例教程
2014/08/23 PHP
php实现HTML实体编号与非ASCII字符串相互转换类实例
2016/11/02 PHP
直接生成打开窗口代码,不必下载
2008/05/14 Javascript
JavaScript中的索引数组、关联数组和静态数组、动态数组讲解
2014/11/08 Javascript
Javascript学习笔记之 函数篇(三) : 闭包和引用
2014/11/23 Javascript
jQuery实现多按钮单击变色
2014/11/27 Javascript
jQuery实现感应鼠标动画效果自动伸长的输入框实例
2015/02/24 Javascript
JS 实现倒计时数字时钟效果【附实例代码】
2016/03/30 Javascript
jQuery UI Bootstrap是什么?
2016/06/17 Javascript
微信小程序 火车票查询实例讲解
2016/10/17 Javascript
详解angularJs中自定义directive的数据交互
2017/01/13 Javascript
jQuery简单实现向列表动态添加新元素的方法示例
2017/12/25 jQuery
通过Nodejs搭建网站简单实现注册登录流程
2019/06/14 NodeJs
100行代码实现vue表单校验功能(小白自编)
2019/11/19 Javascript
bootstrap-paginator服务器端分页使用方法详解
2020/02/13 Javascript
Vue项目开发常见问题和解决方案总结
2020/09/11 Javascript
如何手写简易的 Vue Router
2020/10/10 Javascript
[02:42]DOTA2城市挑战赛收官在即 四强之争风起云涌
2018/06/05 DOTA
详解Python之数据序列化(json、pickle、shelve)
2017/03/30 Python
浅谈使用Python内置函数getattr实现分发模式
2018/01/22 Python
python脚本生成caffe train_list.txt的方法
2018/04/27 Python
Python中按值来获取指定的键
2019/03/04 Python
Python基于机器学习方法实现的电影推荐系统实例详解
2019/06/25 Python
Python爬虫逆向分析某云音乐加密参数的实例分析
2020/12/04 Python
GAP阿联酋官网:GAP UAE
2017/11/30 全球购物
荷兰家电销售网站:Welhof
2020/12/08 全球购物
创建市级文明单位实施方案
2014/03/01 职场文书
庆元旦文艺演出主持词
2014/03/27 职场文书
珍爱生命演讲稿
2014/05/10 职场文书
信息工作经验交流材料
2014/05/28 职场文书
专业见习报告范文
2014/11/03 职场文书
2015年国税春训心得体会
2015/03/09 职场文书
浅谈tf.train.Saver()与tf.train.import_meta_graph的要点
2021/05/26 Python
JavaScript 定时器详情
2021/11/11 Javascript