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语言map与string的相互转换的实现
Apr 07 Golang
为什么不建议在go项目中使用init()
Apr 12 Golang
golang 生成对应的数据表struct定义操作
Apr 28 Golang
Golang 空map和未初始化map的注意事项说明
Apr 29 Golang
golang import自定义包方式
Apr 29 Golang
golang 定时任务方面time.Sleep和time.Tick的优劣对比分析
May 05 Golang
使用golang编写一个并发工作队列
May 08 Golang
Go Plugins插件的实现方式
Aug 07 Golang
Golang数据类型和相互转换
Apr 12 Golang
GO语言字符串处理函数之处理Strings包
Apr 14 Golang
Golang日志包的使用
Apr 20 Golang
Go语言怎么使用变长参数函数
Jul 15 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
多重?l件?合查?(一)
2006/10/09 PHP
php桌面中心(三) 修改数据库
2007/03/11 PHP
php下用GD生成生成缩略图的两个选择和区别
2007/04/17 PHP
Windows IIS PHP 5.2 安装与配置方法
2009/06/08 PHP
PHP操作MongoDB时的整数问题及对策说明
2011/05/02 PHP
解决PHP超大文件下载,断点续传下载的方法详解
2013/06/06 PHP
php入门教程之Zend Studio设置与开发实例
2016/09/09 PHP
goto语法在PHP中的使用教程
2020/09/17 PHP
JavaScript获得url所有参数键值表的方法
2015/03/21 Javascript
js实现的四级左侧网站分类菜单实例
2015/05/06 Javascript
jquery ui dialog替代confirm实例分析
2016/01/25 Javascript
终于实现了!精彩的jquery弹幕效果
2016/07/18 Javascript
AngularJS表单验证中级篇(3)
2016/09/28 Javascript
Vue实例简单方法介绍
2017/01/20 Javascript
微信小程序后台解密用户数据实例详解
2017/06/28 Javascript
微信小程序表单验证功能完整实例
2017/12/01 Javascript
vue中keep-alive的用法及问题描述
2018/05/15 Javascript
Vue 用Vant实现时间选择器的示例代码
2019/10/25 Javascript
vue项目中使用particles实现粒子背景效果及遇到的坑(按钮没有点击响应)
2020/02/11 Javascript
vue 公共列表选择组件,引用Vant-UI的样式方式
2020/11/02 Javascript
Python3中lambda表达式与函数式编程讲解
2019/01/14 Python
QML使用Python的函数过程解析
2019/09/26 Python
给我一面国旗 python帮你实现
2019/09/30 Python
Django中使用haystack+whoosh实现搜索功能
2019/10/08 Python
用Python在Excel里画出蒙娜丽莎的方法示例
2020/04/28 Python
漫威玩具服装及周边商品官方购物网站:Marvel Shop
2019/05/11 全球购物
JAVA和C++区别都有哪些
2015/03/30 面试题
大学毕业生通用自荐信范文
2013/10/31 职场文书
职业教育毕业生求职信
2013/11/09 职场文书
售前工程师职业生涯规划
2014/03/02 职场文书
质量月口号
2014/06/20 职场文书
一份恶作剧的检讨书
2014/09/13 职场文书
2017新年晚会开幕词
2016/03/03 职场文书
个人道歉信大全
2019/04/11 职场文书
JavaScript实现队列结构过程
2021/12/06 Javascript
Anaconda安装pytorch和paddle的方法步骤
2022/04/03 Python