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 相关文章推荐
goland 清除所有的默认设置操作
Apr 28 Golang
go结构体嵌套的切片数组操作
Apr 28 Golang
解决Golang中goroutine执行速度的问题
May 02 Golang
golang gopm get -g -v 无法获取第三方库的解决方案
May 05 Golang
Go遍历struct,map,slice的实现
Jun 13 Golang
试了下Golang实现try catch的方法
Jul 01 Golang
Go Plugins插件的实现方式
Aug 07 Golang
Golang中channel的原理解读(推荐)
Oct 16 Golang
一文搞懂Golang 时间和日期相关函数
Dec 06 Golang
深入理解 Golang 的字符串
May 04 Golang
Go结合Gin导出Mysql数据到Excel表格
Aug 05 Golang
基于Python实现西西成语接龙小助手
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调试及性能分析工具Xdebug详解
2017/02/09 PHP
Js+Dhtml:WEB程序员简易开发工具包(预先体验版)
2006/11/07 Javascript
Javascript面向对象之四 继承
2011/02/08 Javascript
深入理解JavaScript系列(15) 函数(Functions)
2012/04/12 Javascript
jquery图片放大镜功能的实例代码
2013/03/26 Javascript
JavaScript作用域链示例分享
2014/05/27 Javascript
JS+CSS实现下拉列表框美化效果(3款)
2015/08/15 Javascript
解析JavaScript中的字符串类型与字符编码支持
2016/06/24 Javascript
js操作XML文件的实现方法兼容IE与FireFox
2016/06/25 Javascript
详解Vue使用 vue-cli 搭建项目
2017/04/20 Javascript
微信小程序简单实现form表单获取输入数据功能示例
2017/11/30 Javascript
使用vue-router设置每个页面的title方法
2018/02/11 Javascript
详解javascript 正则表达式之分组与前瞻匹配
2018/05/30 Javascript
微信小程序WebSocket实现聊天对话功能
2018/07/06 Javascript
vue生成token并保存到本地存储中
2018/07/17 Javascript
angularJs复选框checkbox选中进行ng-show显示隐藏的方法
2018/10/08 Javascript
JS实现选项卡插件的两种写法(jQuery和class)
2020/12/30 jQuery
[02:36]DOTA2英雄基础教程 一击致命幻影刺客
2013/12/06 DOTA
[01:51]开启你的城市传奇 完美世界城市挑战赛开始报名
2018/10/09 DOTA
在Python中操作时间之strptime()方法的使用
2020/12/30 Python
详解Python中for循环是如何工作的
2017/06/30 Python
Python 实现购物商城,含有用户入口和商家入口的示例
2017/09/15 Python
flask框架路由常用定义方式总结
2019/07/23 Python
Python实现不规则图形填充的思路
2020/02/02 Python
python中upper是做什么用的
2020/07/20 Python
openCV提取图像中的矩形区域
2020/07/21 Python
十八大标语口号
2014/10/09 职场文书
升职自荐信怎么写
2015/03/05 职场文书
地球上的星星观后感
2015/06/02 职场文书
小学一年级数学教学反思
2016/02/16 职场文书
Oracle设置DB、监听和EM开机启动的方法
2021/04/25 Oracle
Python 中的单分派泛函数你真的了解吗
2021/06/22 Python
springboot集成springCloud中gateway时启动报错的解决
2021/07/16 Java/Android
Java基础——Map集合
2022/04/01 Java/Android
python疲劳驾驶困倦低头检测功能的实现
2022/04/04 Python
阿里云ECS云服务器快照的概念以及如何使用
2022/04/21 Servers