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中切片copy复制和等号复制的区别介绍
Apr 27 Golang
go结构体嵌套的切片数组操作
Apr 28 Golang
golang 接口嵌套实现复用的操作
Apr 29 Golang
golang 实现时间戳和时间的转化
May 07 Golang
golang中的并发和并行
May 08 Golang
Golang 获取文件md5校验的方法以及效率对比
May 08 Golang
浅谈Golang 切片(slice)扩容机制的原理
Jun 09 Golang
Go语言基础函数基本用法及示例详解
Nov 17 Golang
如何利用golang运用mysql数据库
Mar 13 Golang
Golang 遍历二叉树
Apr 19 Golang
实现GO语言对数组切片去重
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中的类-什么叫类
2006/11/20 PHP
JpGraph php柱状图使用介绍
2011/08/23 PHP
php阳历转农历优化版
2016/08/08 PHP
JS 添加网页桌面快捷方式的代码详细整理
2012/12/27 Javascript
JavaScript排序算法之希尔排序的2个实例
2014/04/04 Javascript
JavaScript动态设置div的样式的方法
2015/12/26 Javascript
分享jQuery插件的学习笔记
2016/01/14 Javascript
Angular 2父子组件数据传递之局部变量获取子组件其他成员
2017/07/04 Javascript
underscore之Chaining_动力节点Java学院整理
2017/07/10 Javascript
vue的mixins属性详解
2018/03/14 Javascript
vue超时计算的组件实例代码
2018/07/09 Javascript
JavaScript 作用域scope简单汇总
2019/10/23 Javascript
JS监听组合按键思路及实现过程
2020/04/17 Javascript
Vue使用Proxy代理后仍无法生效的解决
2020/11/13 Javascript
[01:36:57]【09DOTA2第一视角】小骷髅
2014/04/16 DOTA
用实例详解Python中的Django框架中prefetch_related()函数对数据库查询的优化
2015/04/01 Python
python中的编码知识整理汇总
2016/01/26 Python
python 系统调用的实例详解
2017/07/11 Python
Django1.9 加载通过ImageField上传的图片方法
2018/05/25 Python
Python爬取成语接龙类网站
2018/10/19 Python
Python使用正则表达式分割字符串的实现方法
2019/07/16 Python
python烟花效果的代码实例
2020/02/25 Python
python为什么要安装到c盘
2020/07/20 Python
定制别致的瑜伽垫:Sugarmat
2019/06/21 全球购物
六道php面试题附答案
2014/06/05 面试题
大学生心理活动总结
2014/07/04 职场文书
股份合作协议书
2014/09/10 职场文书
个人委托书范本
2014/09/13 职场文书
2014领导班子四风剖析对照检查材料思想汇报
2014/09/20 职场文书
美国旅游签证工作证明
2014/10/14 职场文书
机关干部作风建设剖析材料
2014/10/23 职场文书
优秀党员先进事迹材料
2014/12/18 职场文书
民主生活会主持词
2015/07/01 职场文书
导游词之桂林
2019/08/20 职场文书
python爬虫selenium模块详解
2021/03/30 Python
Python类方法总结讲解
2021/07/26 Python