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判断key是否在map中的代码
Apr 24 Golang
Go语言使用select{}阻塞main函数介绍
Apr 25 Golang
go 原生http web 服务跨域restful api的写法介绍
Apr 27 Golang
golang协程池模拟实现群发邮件功能
May 02 Golang
Golang 编译成DLL文件的操作
May 06 Golang
golang switch语句的灵活写法介绍
May 06 Golang
解决golang 关于全局变量的坑
May 06 Golang
Go 语言结构实例分析
Jul 04 Golang
golang实现浏览器导出excel文件功能
Mar 25 Golang
golang使用map实现去除重复数组
Apr 14 Golang
Golang 对es的操作实例
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
压力如何影响浓缩咖啡品质
2021/03/03 咖啡文化
php数组总结篇(一)
2008/09/30 PHP
PHP的伪随机数与真随机数详解
2015/05/27 PHP
php基础设计模式大全(注册树模式、工厂模式、单列模式)
2015/08/31 PHP
全面解读PHP的Yii框架中的日志功能
2016/03/17 PHP
php设计模式之适配器模式实例分析【星际争霸游戏案例】
2020/04/07 PHP
IE 缓存策略的BUG的解决方法
2007/07/21 Javascript
JS实现悬浮移动窗口(悬浮广告)的特效
2013/03/12 Javascript
JavaScript获取FCK编辑器信息的具体方法
2013/07/12 Javascript
JS中引用百度地图并将百度地图的logo和信息去掉
2013/09/29 Javascript
Javascript之this关键字深入解析
2013/11/12 Javascript
Jquery给基本控件的取值、赋值示例
2014/05/23 Javascript
JQuery选中checkbox方法代码实例(全选、反选、全不选)
2015/04/27 Javascript
jquery自定义右键菜单、全选、不连续选择
2016/03/01 Javascript
最棒的Angular2表格控件
2016/08/10 Javascript
bootstrap flask登录页面编写实例
2016/11/01 Javascript
JS中如何实现复选框全选功能
2016/12/19 Javascript
Node.js中使用mongoose操作mongodb数据库的方法
2017/09/12 Javascript
微信小程序基于slider组件动态修改标签透明度的方法示例
2017/12/04 Javascript
微信小程序跨页面数据传递事件响应实现过程解析
2019/12/19 Javascript
vue在线动态切换主题色方案
2020/03/26 Javascript
探究Python的Tornado框架对子域名和泛域名的支持
2015/05/02 Python
Python 一句话生成字母表的方法
2019/01/02 Python
Python文件操作模拟用户登陆代码实例
2020/06/09 Python
关于python scrapy中添加cookie踩坑记录
2020/11/17 Python
深入浅析css3 border-image边框图像详解
2015/11/24 HTML / CSS
html5 Canvas画图教程(11)—使用lineTo/arc/bezierCurveTo画椭圆形
2013/01/09 HTML / CSS
为娇小女性量身打造:Petite Studio
2018/11/01 全球购物
大学生学习自我评价
2014/01/13 职场文书
物流创业计划书
2014/02/01 职场文书
2015年档案管理工作总结
2015/04/08 职场文书
停发工资证明范本
2015/06/12 职场文书
网吧温馨提示
2015/07/17 职场文书
遗嘱格式范本
2015/08/07 职场文书
详解Js模块化的作用原理和方案
2021/04/29 Javascript
SpringCloud Alibaba项目实战之nacos-server服务搭建过程
2021/06/21 Java/Android