go语言使用接口编程
2022/8/11 14:27:30
本文主要是介绍go语言使用接口编程,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
Golang 语言怎么使用接口编程?
01
介绍
关于 Golang 语言接口的使用,在之前的一篇公众号文章中已经介绍过,未阅读的读者朋友,如果感兴趣,可以按需翻阅文末推荐阅读列表。本文我们主要介绍在 Golang 语言中,如何使用接口编程?以及接口的使用技巧。
02
接口编程
在 Golang 应用开发中,除了使用 Func,我们还经常会用到 Method,比如:
示例代码:
type Cat struct { name string } func (c Cat) Eat() { fmt.Printf("%s 正在吃饭\n", c.name) } func main () { c := Cat{name: "kitty"} c.Eat() }
阅读上面这段代码,我们定义了一个 Cat 结构体,然后实现 Eat 方法。在 Golang 语言中,使用 Method 和使用 Func 的区别是,使用 Method 可以将类型和方法封装在一起,实现强耦合。
但是,如果我们除了 Cat 之外,现在又新增了 Dog,也要实现 Eat 方法。我们除了也定义一个 Dog 结构体,然后实现 Eat 方法之外。还可以定义一个 Animal 接口,实现多态。
示例代码:
type Animal interface { Eat() } type Cat struct { name string } type Dog struct { name string } func (c Cat) Eat() { fmt.Printf("%s 正在吃饭\n", c.name) } func (c Cat) Sleep() { fmt.Printf("%s 正在睡觉\n", c.name) } func (d Dog) Eat() { fmt.Printf("%s 正在吃饭\n", d.name) } func main () { var a Animal c := Cat{name: "kitty"} d := Dog{name: "101"} a = c a.Eat() a = d a.Eat() }
阅读上面这段代码,我们定义了一个包含 Eat()
方法的接口 Animal,Cat 和 Dog 分别实现 Animal 接口的 Eat()
方法,然后就可以通过将 Cat 类型和 Dog 类型的变量赋值给 Animal 接口,实现多态。
除此之外,我们还可以对上面这段代码进一步优化,上面这段代码虽然实现了多态,但是实现上有些繁琐。我们可以声明一个接收 Animal 接口类型参数的函数 AnimalAction()
。
示例代码:
type Animal interface { Action() string } type Cat struct { name string } type Dog struct { name string } func (c Cat) Action() string { return fmt.Sprintf("Cat %s 正在吃饭", c.name) } func (d Dog) Action() string { return fmt.Sprintf("Dog %s 正在吃饭", d.name) } func AnimalAction (a Animal) { fmt.Println(a.Action()) } func main () { c := Cat{name: "Kitty"} AnimalAction(c) d := Dog{name: "101"} AnimalAction(d) }
阅读上面这段代码,是否感觉似曾相识。在 Golang 语言标准库中有很多这种用法。
03
接口使用技巧
-
尽量定义包含方法少的接口,建议控制接口方法数量不超过 3 个
我们可以在一些 Golang 语言标准库中发现,很多接口包含的方法数量都不超过 3 个,也有很多接口仅包含 1 个方法。
控制接口包含方法的数量尽量少的好处是接口包含的方法越少,越容易实现和组合。
-
如何强制实现接口的所有方法
Golang 语言中的接口是隐式实现的,并且不强制实现接口的所有方法。如果我们需要强制实现接口的所有方法,做法如下:
示例代码:
type Animal interface { Eat() Sleep() } type Cat struct {} func (c Cat) Eat() { fmt.Println("Cat 正在吃饭") } // func (c Cat) Sleep() { // fmt.Println("Cat 正在睡觉") // } type Dog struct {} func (d Dog) Eat() { fmt.Println("Dog 正在吃饭") } // func (d Dog) Sleep() { // fmt.Println("Dog 正在睡觉") // } func main () { var _ Animal = (*Cat)(nil) var _ Animal = (*Dog)(nil) c := Cat{} c.Eat() d := Dog{} d.Eat() }
OutPut:
cannot use (*Cat)(nil) (type *Cat) as type Animal in assignment: *Cat does not implement Animal (missing Sleep method) cannot use (*Dog)(nil) (type *Dog) as type Animal in assignment: *Dog does not implement Animal (missing Sleep method)
阅读上面这段代码,我们通过声明变量:
var _ Animal = (*Cat)(nil) var _ Animal = (*Dog)(nil)
强制实现接口的所有方法。
-
尽量不使用空接口类型作为函数参数
Golang 语言是强类型静态语言,Golang 编译器在编译期间会对变量做类型检查。如果函数或方法接收的参数类型是空接口
interface{}
,编译器将收不到任何信息,也就不会对空接口类型的变量进行类型检查,接收参数的类型将需要开发者自己做类型检查。所以开发者尽量不要使用空接口interface{}
变量作为接收参数。但是空接口
interface{}
类型也并非完全无用武之地,因为目前 Golang 语言(v1.16.4)还未支持泛型,当需要处理未知类型的参数时,可以使用空接口interface{}
类型,在 Golang 语言标准库中也有该使用方式,比如fmt
包。
04
总结
本文我们介绍了如何使用接口编程,通过一个简单示例,循序渐进地介绍了接口编程的使用方式,此外,我们还介绍了一些接口使用技巧。
建议读者朋友们动手敲一下示例代码,通过亲自运行代码加深理解。关于接口本身的介绍,读者朋友们可以按需阅读推荐列表中的相关文章。
推荐阅读:
Go语言学习之 interface** **
Go team 开源项目 Go Cloud 使用的依赖注入工具 Wire 怎么使用?
怎么发布 Go Modules v1 版本?
Go Modules 如何创建和发布 v2 及更高版本?
保持 Modules 的兼容性
参考资料:
https://golang.org/doc/effective_go#interfaces_and_types
这篇关于go语言使用接口编程的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-12-24MongoDB资料:新手入门完全指南
- 2024-12-20go-zero 框架的 RPC 服务 启动start和停止 底层是怎么实现的?-icode9专业技术文章分享
- 2024-12-19Go-Zero 框架的 RPC 服务启动和停止的基本机制和过程是怎么实现的?-icode9专业技术文章分享
- 2024-12-18怎么在golang中使用gRPC测试mock数据?-icode9专业技术文章分享
- 2024-12-15掌握PageRank算法核心!你离Google优化高手只差一步!
- 2024-12-15GORM 中的标签 gorm:"index"是什么?-icode9专业技术文章分享
- 2024-12-11怎么在 Go 语言中获取 Open vSwitch (OVS) 的桥接信息(Bridge)?-icode9专业技术文章分享
- 2024-12-11怎么用Go 语言的库来与 Open vSwitch 进行交互?-icode9专业技术文章分享
- 2024-12-11怎么在 go-zero 项目中发送阿里云短信?-icode9专业技术文章分享
- 2024-12-11怎么使用阿里云 Go SDK (alibaba-cloud-sdk-go) 发送短信?-icode9专业技术文章分享