ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

go语言使用接口编程

2022-08-10 14:31:46  阅读:204  来源: 互联网

标签:name 编程 Dog 接口 Cat Animal go Eat


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

标签:name,编程,Dog,接口,Cat,Animal,go,Eat
来源: https://www.cnblogs.com/root-123/p/16572306.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有