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 http使用踩过的坑与填坑指南
Apr 27 Golang
基于Go Int转string几种方式性能测试
Apr 28 Golang
Golang: 内建容器的用法
May 05 Golang
Go 自定义package包设置与导入操作
May 06 Golang
Go 在 MongoDB 中常用查询与修改的操作
May 07 Golang
go语言使用Casbin实现角色的权限控制
Jun 26 Golang
Go 语言结构实例分析
Jul 04 Golang
golang实现一个简单的websocket聊天室功能
Oct 05 Golang
Go语言基础map用法及示例详解
Nov 17 Golang
Go语言实现一个简单的并发聊天室的项目实战
Mar 18 Golang
golang语言指针操作
Apr 14 Golang
Golang获取List列表元素的四种方式
Apr 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下批量挂马和批量清马代码
2011/02/27 PHP
PHP中判断变量为空的几种方法分享
2013/08/26 PHP
php中$_GET与$_POST过滤sql注入的方法
2014/11/03 PHP
详解PHP执行定时任务的实现思路
2015/12/21 PHP
laravel开发环境homestead搭建过程详解
2020/07/03 PHP
JQuery的一些小应用收集
2010/03/27 Javascript
EasySlider 基于jQuery功能强大简单易用的滑动门插件
2010/06/11 Javascript
JS+flash实现chrome和ie浏览器下同时可以复制粘贴
2013/09/22 Javascript
jquery实现类似淘宝星星评分功能有截图
2014/09/15 Javascript
json+jQuery实现的无限级树形菜单效果代码
2015/08/27 Javascript
详解Backbone.js框架中的模型Model与其集合collection
2016/05/05 Javascript
jQuery读取XML文件的方法示例
2017/02/03 Javascript
使用Vue完成一个简单的todolist的方法
2017/12/01 Javascript
何时/使用 Vue3 render 函数的教程详解
2020/07/25 Javascript
vue实现移动端项目多行文本溢出省略
2020/07/29 Javascript
浅谈javascript事件环微任务和宏任务队列原理
2020/09/12 Javascript
解决js中的setInterval清空定时器不管用问题
2020/11/17 Javascript
Python中的推导式使用详解
2015/06/03 Python
python 安装virtualenv和virtualenvwrapper的方法
2017/01/13 Python
Python中使用Counter进行字典创建以及key数量统计的方法
2018/07/06 Python
对numpy中向量式三目运算符详解
2018/10/31 Python
python通用读取vcf文件的类(复制粘贴即可用)
2020/02/29 Python
Python定义一个函数的方法
2020/06/15 Python
Python Excel vlookup函数实现过程解析
2020/06/22 Python
Python使用Pygame绘制时钟
2020/11/29 Python
python批量生成身份证号到Excel的两种方法实例
2021/01/14 Python
美国知名眼镜网站:Target Optical
2020/04/04 全球购物
意大利网上书店:LaFeltrinelli
2020/06/12 全球购物
如何提高JDBC的性能
2013/04/30 面试题
个人近期表现材料
2014/02/11 职场文书
公证书样本
2014/04/10 职场文书
读书月活动方案
2014/05/22 职场文书
谢师宴答谢词
2015/01/05 职场文书
水电施工员岗位职责
2015/04/11 职场文书
详解Laravel框架的依赖注入功能
2021/05/27 PHP
浅谈GO中的Channel以及死锁的造成
2022/03/18 Golang