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 interface{}==nil 的几种坑及原理分析
Apr 24 Golang
golang中的空slice案例
Apr 27 Golang
golang elasticsearch Client的使用详解
May 05 Golang
go语言中fallthrough的用法说明
May 06 Golang
golang 实现时间戳和时间的转化
May 07 Golang
Golang 实现获取当前函数名称和文件行号等操作
May 08 Golang
go语言使用Casbin实现角色的权限控制
Jun 26 Golang
Go 语言下基于Redis分布式锁的实现方式
Jun 28 Golang
Go 语言中 20 个占位符的整理
Oct 16 Golang
golang操作rocketmq的示例代码
Apr 06 Golang
Golang日志包的使用
Apr 20 Golang
详解Go语言中Get/Post请求测试
Jun 01 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 print EOF实现方法
2009/05/21 PHP
php !function_exists("T7FC56270E7A70FA81A5935B72EACBE29"))代码解密
2011/01/07 PHP
jQuery 性能优化指南(3)
2009/05/21 Javascript
JQuery 选择器、过滤器介绍
2011/02/14 Javascript
js 自制滚动条的小例子
2013/03/16 Javascript
动态的绑定事件addEventListener方法的使用
2014/01/24 Javascript
Node.js 服务器端应用开发框架 -- Hapi.js
2014/07/29 Javascript
一个不错的仿携程自定义数据下拉选择select
2014/09/01 Javascript
javascript结合ajax读取txt文件内容
2014/12/05 Javascript
实现前后端数据交互方法汇总
2015/04/07 Javascript
JavaScript 里的类数组对象
2015/04/08 Javascript
jq实现左侧显示图片右侧文字滑动切换效果
2015/08/04 Javascript
jQuery插件datatables使用教程
2016/04/21 Javascript
Bootstrap中的Dropdown下拉菜单更改为悬停(hover)触发
2016/08/31 Javascript
Bootstrap分页插件之Bootstrap Paginator实例详解
2016/10/15 Javascript
详解vue之页面缓存问题(基于2.0)
2017/01/10 Javascript
使用bootstraptable插件实现表格记录的查询、分页、排序操作
2017/08/06 Javascript
Angular.js中window.onload(),$(document).ready()的写法浅析
2017/09/28 Javascript
脚手架vue-cli工程webpack的作用和特点
2018/09/29 Javascript
angular4笔记系列之内置指令小结
2018/11/09 Javascript
vue实现将一个数组内的相同数据进行合并
2019/11/07 Javascript
JS removeAttribute()方法实现删除元素的某个属性
2021/01/11 Javascript
node.js 基于 STMP 协议和 EWS 协议发送邮件
2021/02/14 Javascript
[01:03:27]NAVI vs EG 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/17 DOTA
Python实现模拟时钟代码推荐
2015/11/08 Python
python 从文件夹抽取图片另存的方法
2018/12/04 Python
pycharm修改界面主题颜色的方法
2019/01/17 Python
python中的TCP(传输控制协议)用法实例分析
2019/11/15 Python
Python键鼠操作自动化库PyAutoGUI简介(小结)
2020/05/17 Python
详解Python爬虫爬取博客园问题列表所有的问题
2021/01/18 Python
物业管理毕业生个人的求职信
2013/11/30 职场文书
设计师个人求职信范文
2014/02/02 职场文书
宣传活动总结范文
2014/07/01 职场文书
火烧圆明园的观后感
2015/06/03 职场文书
在pycharm中无法import所安装的库解决方案
2021/05/31 Python
tomcat默认最大连接数及相关调整方法
2022/05/06 Servers