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 实现超大文件读取的两种方法
Apr 27 Golang
golang 实现菜单树的生成方式
Apr 28 Golang
使用Golang的channel交叉打印两个数组的操作
Apr 29 Golang
解决golang 关于全局变量的坑
May 06 Golang
使用golang编写一个并发工作队列
May 08 Golang
再次探讨go实现无限 buffer 的 channel方法
Jun 13 Golang
Golang中channel的原理解读(推荐)
Oct 16 Golang
golang三种设计模式之简单工厂、方法工厂和抽象工厂
Apr 10 Golang
golang操作redis的客户端包有多个比如redigo、go-redis
Apr 14 Golang
Golang MatrixOne使用介绍和汇编语法
Apr 19 Golang
Golang 实现 WebSockets 之创建 WebSockets
Apr 24 Golang
Go调用Rust方法及外部函数接口前置
Jun 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对数组排序代码分享
2014/02/24 PHP
PHP小技巧之JS和CSS优化工具Minify的使用方法
2014/05/19 PHP
详解php魔术方法(Magic methods)的使用方法
2016/02/14 PHP
解决thinkPHP 5 nginx 部署时,只跳转首页的问题
2019/10/16 PHP
JavaScript实现的石头剪刀布游戏源码分享
2014/08/22 Javascript
一个不错的js html页面倒计时可精确到秒
2014/10/22 Javascript
js实现鼠标悬停图片上时滚动文字说明的方法
2015/02/17 Javascript
jQuery实现网页抖动的菜单抖动效果
2015/08/07 Javascript
基于JavaScript实现根据手机定位获取当前具体位置(X省X市X县X街道X号)
2015/12/29 Javascript
深入探究AngularJS框架中Scope对象的超级教程
2016/01/04 Javascript
JS实现消息来时让网页标题闪动效果的方法
2016/04/20 Javascript
Bootstrap自定义文件上传下载样式
2016/05/26 Javascript
jQuery基于事件控制实现点击显示内容下拉效果
2017/03/07 Javascript
vue解决跨域路由冲突问题思路解析
2017/11/03 Javascript
JS脚本实现网页自动秒杀点击
2018/01/11 Javascript
详解nuxt sass全局变量(公共scss解决方案)
2018/06/27 Javascript
vue中的计算属性实例详解
2018/09/19 Javascript
使用Vue-Awesome-Swiper实现旋转叠加轮播效果&平移轮播效果
2019/08/16 Javascript
[01:50]2014DOTA2西雅图邀请赛 专访欢乐周宝龙
2014/07/08 DOTA
跟老齐学Python之有容乃大的list(1)
2014/09/14 Python
Python中的模块和包概念介绍
2015/04/13 Python
Python判断直线和矩形是否相交的方法
2015/07/14 Python
对python .txt文件读取及数据处理方法总结
2018/04/23 Python
对python中的float除法和整除法的实例详解
2019/07/20 Python
基于python3的socket聊天编程
2020/02/17 Python
解决pip install psycopg2出错问题
2020/07/09 Python
CSS Grid布局教程之网格单元格布局
2014/12/30 HTML / CSS
LocalStorage记住用户和密码功能
2017/07/24 HTML / CSS
印尼最大的婴儿用品购物网站:Orami
2017/09/28 全球购物
社区党务公开实施方案
2014/03/18 职场文书
幼儿园家长安全责任书
2014/07/22 职场文书
法定代表人资格证明书
2014/09/11 职场文书
2015年图书馆个人工作总结
2015/05/26 职场文书
python实现语音常用度量方法的代码详解
2021/05/25 Python
SpringBoot整合RabbitMQ的5种模式实战
2021/08/02 Java/Android
zabbix如何添加监控主机和自定义监控项
2022/08/14 Servers