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 相关文章推荐
golang interface判断为空nil的实现代码
Apr 24 Golang
彻底理解golang中什么是nil
Apr 29 Golang
浅谈golang 中time.After释放的问题
May 05 Golang
Go标准容器之Ring的使用说明
May 05 Golang
Go 自定义package包设置与导入操作
May 06 Golang
Golang的继承模拟实例
Jun 30 Golang
Golang并发操作中常见的读写锁详析
Aug 30 Golang
Go语言基础函数基本用法及示例详解
Nov 17 Golang
Go语言grpc和protobuf
Apr 13 Golang
Go语言入门exec的基本使用
May 20 Golang
Go结合Gin导出Mysql数据到Excel表格
Aug 05 Golang
Python测试框架pytest核心库pluggy详解
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
PHP中文汉字验证码
2007/04/08 PHP
PHP常见错误提示含义解释(实用!值得收藏)
2016/04/25 PHP
Javascript Cookie读写删除操作的函数
2010/03/02 Javascript
JavaScript实现统计文本框Textarea字数增强用户体验
2012/12/21 Javascript
jquery动态分页效果堪比时光网
2014/09/25 Javascript
JS制作手机端自适应缩放显示
2015/06/11 Javascript
预防网页挂马的方法总结
2016/11/03 Javascript
jquery hover 不停闪动问题的解决方法(亦为stop()的使用)
2017/02/10 Javascript
jQuery Validate 相关参数及常用的自定义验证规则
2017/03/06 Javascript
socket.io学习教程之基本应用(二)
2017/04/29 Javascript
基于Bootstrap模态对话框只加载一次 remote 数据的解决方法
2017/07/09 Javascript
jQuery进阶实践之利用最优雅的方式如何写ajax请求
2017/12/20 jQuery
react+ant design实现Table的增、删、改的示例代码
2018/12/27 Javascript
Node.js 在本地生成日志文件的方法
2020/02/07 Javascript
python调用cmd复制文件代码分享
2013/12/27 Python
python网络编程示例(客户端与服务端)
2014/04/24 Python
使用Python编写一个简单的tic-tac-toe游戏的教程
2015/04/16 Python
使用Python实现BT种子和磁力链接的相互转换
2015/11/09 Python
python实现八大排序算法(2)
2017/09/14 Python
selenium3+python3环境搭建教程图解
2018/12/07 Python
Pytorch 定义MyDatasets实现多通道分别输入不同数据方式
2020/01/15 Python
django前端页面下拉选择框默认值设置方式
2020/08/09 Python
Python基于tkinter canvas实现图片裁剪功能
2020/11/05 Python
django inspectdb 操作已有数据库数据的使用步骤
2021/02/07 Python
CSS3+js实现简单的时钟特效
2015/03/18 HTML / CSS
营销专业应届生求职信
2013/11/26 职场文书
时尚休闲吧创业计划书
2014/01/25 职场文书
小学毕业典礼主持词
2014/03/27 职场文书
老公爱的承诺书
2014/03/31 职场文书
竞选学习委员演讲稿
2014/04/28 职场文书
幼儿园五一劳动节活动总结
2015/02/09 职场文书
2015教师个人工作总结范文
2015/03/31 职场文书
学校远程教育工作总结
2015/08/11 职场文书
教师节随笔
2015/08/15 职场文书
oracle DGMGRL ORA-16603报错的解决方法(DG Broker)
2021/04/06 Oracle
如何用threejs实现实时多边形折射
2021/05/07 Javascript