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 25 Golang
go语言中切片与内存复制 memcpy 的实现操作
Apr 27 Golang
基于Go Int转string几种方式性能测试
Apr 28 Golang
golang 比较浮点数的大小方式
May 02 Golang
golang日志包logger的用法详解
May 05 Golang
golang fmt格式“占位符”的实例用法详解
Jul 04 Golang
深入理解go slice结构
Sep 15 Golang
浅谈GO中的Channel以及死锁的造成
Mar 18 Golang
Go 中的空白标识符下划线
Mar 25 Golang
golang用type-switch判断interface的实际存储类型
Apr 14 Golang
Go web入门Go pongo2模板引擎
May 20 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 各种应用乱码问题的解决方法
2010/05/09 PHP
跟我学Laravel之快速入门
2014/10/15 PHP
PHP架构及原理知识点详解
2019/12/22 PHP
Add Formatted Text to a Word Document
2007/06/15 Javascript
jquery select动态加载选择(兼容各种浏览器)
2013/02/01 Javascript
chrome浏览器不支持onmouseleave事件的解决技巧
2013/05/31 Javascript
瀑布流布局代码一例
2014/04/11 Javascript
JavaScript strike方法入门实例(给字符串加上删除线)
2014/10/17 Javascript
js中confirm实现执行操作前弹出确认框的方法
2014/11/01 Javascript
在Node.js应用中使用Redis的方法简介
2015/06/24 Javascript
手动初始化Angular的模块与控制器
2016/12/26 Javascript
基于jQuery插件jqzoom实现的图片放大镜效果示例
2017/01/23 Javascript
Bootstrap的popover(弹出框)2秒后定时消失的实现代码
2017/02/27 Javascript
Javascript中prototype与__proto__的关系详解
2018/03/11 Javascript
Vue2.X和Vue3.0数据响应原理变化的区别
2019/11/07 Javascript
vue实现数据控制视图的原理解析
2020/01/07 Javascript
Vue中this.$nextTick的作用及用法
2020/02/04 Javascript
[06:04]DOTA2国际邀请赛纪录片:Just For LGD
2013/08/11 DOTA
Python常见文件操作的函数示例代码
2011/11/15 Python
在Python中使用元类的教程
2015/04/28 Python
Python实现的文本编辑器功能示例
2017/06/30 Python
Python机器学习算法之k均值聚类(k-means)
2018/02/23 Python
Python读写及备份oracle数据库操作示例
2018/05/17 Python
python获取点击的坐标画图形的方法
2019/07/09 Python
Python切片列表字符串如何实现切换
2020/08/06 Python
一款基于css3和jquery实现的动画显示弹出层按钮教程
2015/01/04 HTML / CSS
html5中canvas学习笔记2-判断浏览器是否支持canvas
2013/01/06 HTML / CSS
详解如何解决canvas图片getImageData,toDataURL跨域问题
2018/09/17 HTML / CSS
英国团购网站:Groupon英国
2017/11/28 全球购物
荷兰包包购物网站:The Little Green Bag
2018/03/17 全球购物
Nike荷兰官方网站:Nike.com (NL)
2018/04/19 全球购物
医院深入开展党的群众路线教育实践活动实施方案
2014/08/27 职场文书
幼儿园开学家长寄语(2016秋季)
2015/12/03 职场文书
OpenCV图像变换之傅里叶变换的一些应用
2021/07/26 Python
Redis集群节点通信过程/原理流程分析
2022/03/18 Redis
java中如何截取字符串最后一位
2022/07/07 Java/Android