【Golang】Go 通过结构(struct) 实现接口(interface)
一、通过结构(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"))
}
【Golang】Go 通过结构(struct) 实现接口(interface)的更多相关文章
- golang中接口interface和struct结构类的分析
再golang中,我们要充分理解interface和struct这两种数据类型.为此,我们需要优先理解type的作用. type是golang语言中定义数据类型的唯一关键字.对于type中的匿名成员和 ...
- Go语言学习笔记(四)结构体struct & 接口Interface & 反射
加 Golang学习 QQ群共同学习进步成家立业工作 ^-^ 群号:96933959 结构体struct struct 用来自定义复杂数据结构,可以包含多个字段(属性),可以嵌套: go中的struc ...
- Go语言学习笔记(四)结构体struct & 接口Interface & 反射reflect
加 Golang学习 QQ群共同学习进步成家立业工作 ^-^ 群号:96933959 结构体struct struct 用来自定义复杂数据结构,可以包含多个字段(属性),可以嵌套: go中的struc ...
- golang结构体、接口、反射
struct结构体 struct用来自定义复杂数据结构,可以包含多个字段属性,可以嵌套; go中的struct类型理解为类,可以定义方法,和函数定义有些许区别; struct类型是值类型. struc ...
- Golang 接口interface
接口interface 接口是一个或多个方法签名的集合 只要某个类型拥有该接口的所有方法签名,即算实现该接口,无需显示声明实现了哪个接口,这成为Structural Typing 接口只有方法声明,没 ...
- 换个语言学一下 Golang (9)——结构体和接口
基本上到这里的时候,就是上了一个台阶了.Go的精华特点即将展开. 结构体定义 上面我们说过Go的指针和C的不同,结构体也是一样的.Go是一门删繁就简的语言,一切令人困惑的特性都必须去掉. 简单来讲,G ...
- 将c语言的结构体定义变成对应的golang语言的结构体定义,并将golang语言结构体变量的指针传递给c语言,cast C struct to Go struct
https://groups.google.com/forum/#!topic/golang-nuts/JkvR4dQy9t4 https://golang.org/misc/cgo/gmp/gmp. ...
- Go 接口(interface)
文章转载地址:https://www.flysnow.org/2017/04/03/go-in-action-go-interface.html 1.什么是 interface? 简单的说,i ...
- go语言之行--接口(interface)、反射(reflect)详解
一.interface简介 interface(接口)是golang最重要的特性之一,Interface类型可以定义一组方法,但是这些不需要实现.并且interface不能包含任何变量. 简单的说: ...
随机推荐
- QT 资源文件的添加
- bootStrap模态框与select2合用时input不能获取焦点、模态框内部滑动,select选中跳转
bootStrap模态框与select2合用时input不能获取焦点 在bootstrap的模态框里使用select2插件,会导致select2里的input输入框没有办法获得焦点,没有办法输入. 把 ...
- Object 的wait()方法
The java.lang.Object.wait() causes current thread to wait until another thread invokes the notify() ...
- JDBC中的元数据——1.数据库元数据
package metadata; import java.sql.Connection; import java.sql.DatabaseMetaData; import javax.sql.Dat ...
- linux0.01内核源码结构
目录 boot 系统引导. fs 文件系统. include 头文件.一些C标准库,系统核心库. init 入口.main.c. kernel 内核. lib 库.C源程序,一些基本核心的程序. mm ...
- Vivado实战—单周期CPU指令分析
引言 不知道你是否和我有过同样的感受,<计算机组成原理>这门学科学起来如此的艰难:一节课下来,教室黑板上留下了满满的 "足迹",看上去也挺简单的,不就是 0 和 1 ...
- 恶意软件开发——shellcode执行的几种常见方式
一.什么是shellcode? shellcode是一小段代码,用于利用软件漏洞作为有效载荷.它之所以被称为"shellcode",是因为它通常启动一个命令shell,攻击者可以从 ...
- VSCode Navigate Back/Forward
Navigate Back: In the menu bar Choose [Go] -> [Back] (Ctrl+Alt+-) Navigate Forward: In the menu b ...
- TypeScript 中枚举类型的理解?应用场景?
一.是什么 枚举是一个被命名的整型常数的集合,用于声明一组命名的常数,当一个变量有几种可能的取值时,可以将它定义为枚举类型 通俗来说,枚举就是一个对象的所有可能取值的集合 在日常生活中也很常见,例如表 ...
- 两种github action 打包.Net Core 项目docker镜像推送到阿里云镜像仓库
两种github action 打包.Net Core 项目docker镜像推送到阿里云镜像仓库 1.GitHub Actions 是什么? 大家知道,持续集成由很多操作组成,比如抓取代码.运行测试. ...