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 Gin实现文件上传下载的示例代码
Apr 02 Golang
go语言map与string的相互转换的实现
Apr 07 Golang
golang 如何通过反射创建新对象
Apr 28 Golang
彻底理解golang中什么是nil
Apr 29 Golang
Golang 空map和未初始化map的注意事项说明
Apr 29 Golang
基于Golang 高并发问题的解决方案
May 08 Golang
Golang实现AES对称加密的过程详解
May 20 Golang
go使用Gin框架利用阿里云实现短信验证码功能
Aug 04 Golang
Go语言基础函数基本用法及示例详解
Nov 17 Golang
Go语言grpc和protobuf
Apr 13 Golang
Golang 遍历二叉树
Apr 19 Golang
Golang 实现 WebSockets 之创建 WebSockets
Apr 24 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无限分类的类
2007/01/02 PHP
字母顺序颠倒而单词顺序不变的php代码
2010/08/08 PHP
PHP中将字符串转化为整数(int) intval() printf() 性能测试
2020/03/20 PHP
linux下使用crontab实现定时PHP计划任务失败的原因分析
2014/07/05 PHP
php获取字符串前几位的实例(substr返回字符串的子串用法)
2017/03/08 PHP
PHP基于递归实现的约瑟夫环算法示例
2017/08/27 PHP
PHP微商城开源代码实例
2019/03/27 PHP
ext 同步和异步示例代码
2009/09/18 Javascript
Javascript实现的类似Google的Div拖动效果代码
2011/08/09 Javascript
使用Jquery Aajx访问WCF服务(GET、POST、PUT、DELETE)
2012/03/16 Javascript
对frameset、frame、iframe的js操作示例代码
2013/08/16 Javascript
javascript的渐进增强与平稳退化浅谈
2013/11/12 Javascript
JavaScript 里的类数组对象
2015/04/08 Javascript
JavaScript中匿名函数的用法及优缺点详解
2016/06/01 Javascript
关于JS中二维数组的声明方法
2016/09/24 Javascript
JS获取当前地理位置的方法
2017/10/25 Javascript
vue中各种通信传值方式总结
2019/02/14 Javascript
vue el-table实现自定义表头
2019/12/11 Javascript
element-ui树形控件后台返回的数据+生成组织树的工具类
2020/03/05 Javascript
json_decode 索引为数字时自动排序问题解决方法
2020/03/28 Javascript
[00:32]2016完美“圣”典风云人物:Maybe宣传片
2016/12/05 DOTA
[01:11:11]Alliance vs RNG 2019国际邀请赛淘汰赛 败者组BO1 8.20.mp4
2020/07/19 DOTA
python时间整形转标准格式的示例分享
2014/02/14 Python
python数据结构之二叉树的建立实例
2014/04/29 Python
wxPython之解决闪烁的问题
2018/01/15 Python
Django框架文件上传与自定义图片上传路径、上传文件名操作分析
2019/05/10 Python
详解Python3迁移接口变化采坑记
2019/10/11 Python
PyCharm导入python项目并配置虚拟环境的教程详解
2019/10/13 Python
解析HTML5的存储功能和web SQL的相关操作方法
2016/02/19 HTML / CSS
法国家具及室内配件店:home24
2017/01/21 全球购物
《草原的早晨》教学反思
2014/04/08 职场文书
工作期间打牌检讨书范文
2014/11/20 职场文书
2014年应急管理工作总结
2014/11/26 职场文书
国王的演讲观后感
2015/06/03 职场文书
2019学校运动会开幕词
2019/05/13 职场文书
Django使用channels + websocket打造在线聊天室
2021/05/20 Python