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各时间字符串使用解析
Apr 02 Golang
Go语言中的UTF-8实现
Apr 26 Golang
golang中切片copy复制和等号复制的区别介绍
Apr 27 Golang
golang在GRPC中设置client的超时时间
Apr 27 Golang
goland 恢复已更改文件的操作
Apr 28 Golang
go结构体嵌套的切片数组操作
Apr 28 Golang
Go语言空白表示符_的实例用法
Jul 04 Golang
Golang中channel的原理解读(推荐)
Oct 16 Golang
Go归并排序算法的实现方法
Apr 06 Golang
Go语言 详解net的tcp服务
Apr 14 Golang
golang使用map实现去除重复数组
Apr 14 Golang
go goth封装第三方认证库示例详解
Aug 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
关于时间计算的结总
2006/12/06 PHP
IIS php环境配置PHP5 MySQL5 ZendOptimizer phpmyadmin安装与配置
2008/11/18 PHP
php学习笔记 数组遍历实现代码
2011/06/09 PHP
PHP 5.3新增魔术方法__invoke概述
2014/07/23 PHP
PHP导入导出Excel代码
2015/07/07 PHP
php生成gif动画的方法
2015/11/05 PHP
PHP无限极分类函数的实现方法详解
2017/04/15 PHP
浅谈ThinkPHP5.0版本和ThinkPHP3.2版本的区别
2017/06/17 PHP
Yii2语言国际化自动配置详解
2018/08/22 PHP
js右键菜单效果代码
2007/07/21 Javascript
指定js可访问其它域名的cookie的方法
2007/09/18 Javascript
js常用自定义公共函数汇总
2014/01/15 Javascript
推荐 21 款优秀的高性能 Node.js 开发框架
2014/08/18 Javascript
javascript中的作用域和闭包详解
2016/01/13 Javascript
JS组件Bootstrap实现下拉菜单效果代码
2016/04/26 Javascript
jQuery如何防止Ajax重复提交
2016/10/14 Javascript
js html5 css俄罗斯方块游戏再现
2016/10/17 Javascript
简单的jQuery拖拽排序效果的实现(增强动态)
2017/02/09 Javascript
Bootstrap 3 进度条的实现
2017/02/22 Javascript
jQuery实现动态添加和删除input框代码实例
2019/03/29 jQuery
Vue中util的工具函数实例详解
2019/07/08 Javascript
[03:02]辉夜杯主赛事第二日 每日之星
2015/12/27 DOTA
Python使用正则匹配实现抓图代码分享
2015/04/02 Python
深入理解python中的atexit模块
2017/03/07 Python
python切片及sys.argv[]用法详解
2018/05/25 Python
TensorFlow实现模型评估
2018/09/07 Python
Python异步操作MySQL示例【使用aiomysql】
2019/05/16 Python
简单了解python gevent 协程使用及作用
2019/07/22 Python
django框架模型层功能、组成与用法分析
2019/07/30 Python
OpenCV python sklearn随机超参数搜索的实现
2020/01/17 Python
python用什么编辑器进行项目开发
2020/06/17 Python
PyCharm 2020.2下配置Anaconda环境的方法步骤
2020/09/23 Python
html5 利用canvas手写签名并保存的实现方法
2018/07/12 HTML / CSS
写自荐信要注意什么
2013/12/26 职场文书
小学安全教育主题班会
2015/08/12 职场文书
mysql使用FIND_IN_SET和group_concat两个方法查询上下级机构
2022/04/20 MySQL