Go 编程 | 连载 19 - 接口的应用

简介: Go 编程 | 连载 19 - 接口的应用

三、接口也支持继承

结构体可以通过组合实现面向对象继承的特性,接口也可以通过组合实现继承。

定义 Mark1、Mark2 和 Mark44 三个接口,Mark44 除了拥有 Mark1 和 Mark2 的所有功能(方法)外,还有自己独特的功能。

type Mark1 interface {
   Flames() // 喷火
}
type Mark2 interface {
   Fly() // 飞行
}
type Mark44 interface {
   Mark1
   Mark2
   AntiHulk()
}
type IronMan struct {
   Address string
}
func (i IronMan) Flames(){
   fmt.Println("喷火ing")
}
func (i IronMan) Fly(){
   fmt.Println("飞行ing")
}
func (i IronMan) AntiHulk(){
   fmt.Println("反浩克ing")
}
复制代码

在 main 方法中声明一个 Mark44 接口类型的变量并赋值一个 IronMan 结构体的实例化对象。

func main(){
   var mark44 Mark44 = IronMan{"Earth 616"}
   mark44.Fly()
   mark44.AntiHulk()
}
复制代码

执行上述代码,输出结果如下:

飞行ing
反浩克ing
复制代码

当然组合结构体实现组合接口也是可行的,在上述代码中增加一个结构体 Mankind,并将该结构体放进 IronMan 结构体中

type Mankind struct {
   Name string
}
type IronMan struct {
   Mankind
   Address string
}
复制代码

修改 main 方法

func main(){
   man := Mankind{"tony"}
   var mark44 Mark44 = IronMan{man, "Earth 616"}
   mark44.Fly()
   mark44.AntiHulk()
}
复制代码

再次调用 main 方法,输出结果如下:

飞行ing
反浩克ing
复制代码

四、空接口的应用场景

Go 中允许接口中不包含任何方法,既允许空接口的存在,空接口可以直接定义;

type 接口名 interface {
}
复制代码

也可以通过变量声明一个空接口

var 变量名 interface{}
复制代码

空接口变量可以被赋值任何类型的数据。

空接口作为 Map 的值

在定义 Map 的时候通常都需要指定 Map 的键和值的类型,也就是说 Map 中值的类型是固定的,但是如果使用空接口作为值的类型的话,则值可以为任意类型。

func main(){
   info := make(map[string]interface{})
   info["name"] = "stark"
   info["age"] = 33
   info["suit"] = []string{"Mark2", "Mark3", "Mark44", "Mark57"}
   info["balance"] = 3.14
   fmt.Println(info)
}
复制代码

执行上述代码,输出结果如下:

map[age:33 balance:3.14 name:stark suit:[Mark2 Mark3 Mark44 Mark57]]
复制代码

空接口作为函数参数

前面提到空接口类型变量可以接收任意类型的数据,那么将空接口作为函数的参数之后,函数的参数也将不受类型的限制。

新增一个 output 函数,以空接口作为参数

func output(i interface{}){
   fmt.Printf("%v\n", i)
}
复制代码

在 main 函数中新增如下代码

func main(){
   // 原代码保持不变
   output(info)
   output(info["suit"])
   output(info["name"])
}
复制代码

执行上述代码,输出结果如下:

map[age:33 balance:3.14 name:stark suit:[Mark2 Mark3 Mark44 Mark57]]
[Mark2 Mark3 Mark44 Mark57]
stark
复制代码

五、Go 的 error 接口

Go 中的 error 类型也是一个接口,该接口包含了一个 Error() 方法,返回一个 string 字符串

image.png

可以使用结构体来实现 error 接口,用作自定义的业务错误类型

func main() {
   var err error = LoginError{"用户名或密码错误", 00001}
   if err != nil {
      fmt.Println(err)
   } else {
      fmt.Println("登录成功")
   }
}
type LoginError struct {
   Message string
   Code int
}
func (err LoginError) Error() string{
   return err.Message
}
复制代码

执行上述代码,输出结果如下:

用户名或密码错误
复制代码

除了实现 error 接口外还可以导入 errors 标准库,通过 errors.New("错误信息") 实例化的方式来给 err 接口变量赋值

import (
   // 导入 errors 包 
   "errors"
   "fmt"
)
func main() {
   var err error = errors.New("用户名密码错误")
   // 其余代码保持不变 
}
复制代码

但是最常用的其实是第三种方式,既通过 fmt 包下的 Errorf 函数的返回来给 error 接口变量赋值。

Errorf 函数的返回值是一个 error 接口类型

image.png

也可以通过这种方式给 error 接口变量赋值

var err error = fmt.Errorf("%v", "用户名或者密码错误")


相关文章
|
21天前
|
存储 Rust Go
Go nil 空结构体 空接口有什么区别?
本文介绍了Go语言中的`nil`、空结构体和空接口的区别。`nil`是预定义的零值变量,适用于指针、管道等类型;空结构体大小为0,多个空结构体实例指向同一地址;空接口由`_type`和`data`字段组成,仅当两者均为`nil`时,空接口才为`nil`。
Go nil 空结构体 空接口有什么区别?
|
14天前
|
监控 Go API
Go语言在微服务架构中的应用实践
在微服务架构的浪潮中,Go语言以其简洁、高效和并发处理能力脱颖而出,成为构建微服务的理想选择。本文将探讨Go语言在微服务架构中的应用实践,包括Go语言的特性如何适应微服务架构的需求,以及在实际开发中如何利用Go语言的特性来提高服务的性能和可维护性。我们将通过一个具体的案例分析,展示Go语言在微服务开发中的优势,并讨论在实际应用中可能遇到的挑战和解决方案。
|
15天前
|
数据采集 监控 Java
go语言编程学习
【11月更文挑战第3天】
31 7
|
15天前
|
Go 数据处理 API
Go语言在微服务架构中的应用与优势
本文摘要采用问答形式,以期提供更直接的信息获取方式。 Q1: 为什么选择Go语言进行微服务开发? A1: Go语言的并发模型、简洁的语法和高效的编译速度使其成为微服务架构的理想选择。 Q2: Go语言在微服务架构中有哪些优势? A2: 主要优势包括高性能、高并发处理能力、简洁的代码和强大的标准库。 Q3: 文章将如何展示Go语言在微服务中的应用? A3: 通过对比其他语言和展示Go语言在实际项目中的应用案例,来说明其在微服务架构中的优势。
|
21天前
|
Unix Linux Go
go进阶编程:Golang中的文件与文件夹操作指南
本文详细介绍了Golang中文件与文件夹的基本操作,包括读取、写入、创建、删除和遍历等。通过示例代码展示了如何使用`os`和`io/ioutil`包进行文件操作,并强调了错误处理、权限控制和路径问题的重要性。适合初学者和有经验的开发者参考。
|
29天前
|
Java 大数据 Go
Go语言:高效并发的编程新星
【10月更文挑战第21】Go语言:高效并发的编程新星
49 7
|
1月前
|
Cloud Native Go API
Go语言在微服务架构中的创新应用与实践
本文深入探讨了Go语言在构建高效、可扩展的微服务架构中的应用。Go语言以其轻量级协程(goroutine)和强大的并发处理能力,成为微服务开发的首选语言之一。通过实际案例分析,本文展示了如何利用Go语言的特性优化微服务的设计与实现,提高系统的响应速度和稳定性。文章还讨论了Go语言在微服务生态中的角色,以及面临的挑战和未来发展趋势。
|
1月前
|
运维 Go 开发者
Go语言在微服务架构中的应用与优势
本文深入探讨了Go语言在构建微服务架构中的独特优势和实际应用。通过分析Go语言的核心特性,如简洁的语法、高效的并发处理能力以及强大的标准库支持,我们揭示了为何Go成为开发高性能微服务的首选语言。文章还详细介绍了Go语言在微服务架构中的几个关键应用场景,包括服务间通信、容器化部署和自动化运维等,旨在为读者提供实用的技术指导和启发。
|
1月前
|
负载均衡 Go API
探索Go语言在微服务架构中的应用与优势
在这篇技术性文章中,我们将深入探讨Go语言(又称为Golang)在构建微服务架构时的独特优势。文章将通过对比分析Go语言与其他主流编程语言,展示Go在并发处理、性能优化、以及开发效率上的优势。同时,我们将通过一个实际的微服务案例,详细说明如何利用Go语言构建高效、可扩展的微服务系统。
|
1月前
|
Go 数据处理 调度
Go语言中的并发模型:解锁高效并行编程的秘诀
本文将探讨Go语言中独特的并发模型及其在现代软件开发中的应用。通过深入分析 Goroutines 和 Channels,我们将揭示这一模型如何简化并行编程,提升应用性能,并改变开发者处理并发任务的方式。不同于传统多线程编程,Go的并发方法以其简洁性和高效性脱颖而出,为开发者提供了一种全新的编程范式。