GO语言中接口和接口型函数的具体使用

 更新时间:2023年03月09日 08:25:26   作者:雨雨不怕雨  
本文主要介绍了GO语言中接口和接口型函数的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

前言

今天在编码中,看到了一个非常经典的接口用法如下,于是查阅了相关资料,发现此种写法为接口型函数,本文对此做了细致的阐述。

// A Getter loads data for a key.
type Getter interface {
    Get(key string) ([]byte, error)
}

// A GetterFunc implements Getter with a function.
type GetterFunc func(key string) ([]byte, error)

// Get implements Getter interface function
func (f GetterFunc) Get(key string) ([]byte, error) {
    return f(key)
}

GO语言中的接口怎么用?

以上的例程中,首先定义了一个接口,随后定义了一个函数类型实现了此接口,那么GO语言中的接口到底怎么使用呢?

在GO语言中,接口是一种类型,它定义了一组方法的组合,但没有具体的代码实现,接口定义示例如下:

type MyInterface interface {
    Method1() string
    Method2(int) int
}

GO语言中,接口的实现是隐式的。接口实现要绑定在一个类型上面,通过实现类型的方法,来隐式的实现接口,实现示例如下:

type MyType struct {
    // type fields
}

func (t *MyType) Method1() string {
    return "Hello, world!"
}

func (t *MyType) Method2(n int) int {
    return n * n
}

实现接口后,我们可以把接口作为参数传入某个函数中,这样实现了接口的不同数据结构就可以都作为接口传入函数中了:

func MyFunction(i MyInterface) {
    fmt.Println(i.Method1())
    fmt.Println(i.Method2(8))
}

调用此函数时,就可以先声明实现了此接口的数据结构,然后调用函数即可:

func main() {
   t := &MyType{}
   MyFunction(t)
}

调用后即可产生结果:

Hello, world!
64

使用函数类型实现接口有何好处?

以上是使用的结构体隐式实现了接口,还可以自定义函数类型来隐式实现接口。这样可以使用匿名函数或者普通函数(都需要类型转换)直接作为接口参数传入函数中。接口及实现如下:

type MyInterface interface {
    Method1() string
}

type MyInterfaceFunc func()string

func (f MyInterfaceFunc) Method1()string {
    return f()
}

定义一个以接口为参数的函数:

func MyFunction(i MyInterfaceFunc){
   fmt.Println(i.Method1())
}

使用普通函数进行调用:

func Dog()string{
   return "dog dog !"
}

func main() {
   MyFunction(MyInterfaceFunc(Dog))
}

使用匿名函数进行调用:

func main() {
   MyFunction(MyInterfaceFunc(func() string {
      return "hello!"
   }))
}

可以看到,最终的输出都是正确的:

dog dog !
hello!

总的来说,大大的增加了代码的可扩展性,如果没有接口型函数的话,那么想要实现一个新的函数,就需要声明新的类型(如结构体),再隐式的实现接口,再传入MyFunction函数中。有了接口型函数后,那么只需要实现核心逻辑,随后将函数转换为预期的类型即可直接传入。

GO源码例子

net/http 的 Handler 和 HandlerFunc 就是一个典型的接口型函数的例子,Handler的定义如下:

type Handler interface {
    ServeHTTP(ResponseWriter, *Request)
}
type HandlerFunc func(ResponseWriter, *Request)

func (f HandlerFunc) ServeHTTP(w ResponseWriter, r *Request) {
    f(w, r)
}

可以使用http.Handle来对经典的映射路径和处理函数进行映射:

func Handle(pattern string, handler Handler)

观察这个函数,可以发现跟上文的例子很类似,这里的handler就是接口类型,然后在HandlerFunc的基础上做了实现,那么我们可以进行如下的使用:

func home(w http.ResponseWriter, r *http.Request) {
    w.WriteHeader(http.StatusOK)
    _, _ = w.Write([]byte("hello, index page"))
}

func main() {
    http.Handle("/home", http.HandlerFunc(home))
    _ = http.ListenAndServe("localhost:8000", nil)
}

运行起来后,就会监听localhost:8000并运行home函数。这里将home进行类型转换为http.HandlerFunc再作为接口类型传入http.Handle,非常的方便。

我们同样可以使用匿名函数的形式:

func main() {
   http.Handle("/home", http.HandlerFunc(func(writer http.ResponseWriter, request *http.Request) {
      writer.WriteHeader(http.StatusOK)
      writer.Write([]byte("hello word!"))
   }))
   _ = http.ListenAndServe("localhost:8000", nil)
}

可以达到同样的效果。

到此这篇关于GO语言中接口和接口型函数的具体使用的文章就介绍到这了,更多相关GO语言接口和接口型函数内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • golang使用泛型结构体实现封装切片

    golang使用泛型结构体实现封装切片

    这篇文章主要为大家详细介绍了golang使用泛型结构体实现封装切片,即封装切片的增、删、改、查、长度大小、ForEach(遍历切片),感兴趣的小伙伴可以学习一下
    2023-10-10
  • Golang使用CopyIn进行批量创建的示例代码

    Golang使用CopyIn进行批量创建的示例代码

    本文主要介绍了Golang使用CopyIn进行批量创建的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-07-07
  • Go语言dolphinscheduler任务调度处理

    Go语言dolphinscheduler任务调度处理

    这篇文章主要为大家介绍了Go语言dolphinscheduler任务调度处理,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-06-06
  • go语言VScode see 'go help modules' (exit status 1)问题的解决过程

    go语言VScode see 'go help modules' (exit statu

    最近上手学习go语言,准备在VSCode上写程序的时候却发现出了一点问题,下面这篇文章主要给大家介绍了关于go语言VScode see 'go help modules'(exit status 1)问题的解决过程,需要的朋友可以参考下
    2022-07-07
  • Go语法糖之‘...’ 的使用实例详解

    Go语法糖之‘...’ 的使用实例详解

    语法糖(Syntactic sugar),也译为糖衣语法,指计算机语言中添加的某种语法,这种语法对语言的功能并没有影响,但是更方便程序员使用。这篇文章主要给大家介绍Go语法糖之‘...’ 的使用,感兴趣的朋友一起看看吧
    2018-10-10
  • Golang中Json的序列化和反序列化的使用

    Golang中Json的序列化和反序列化的使用

    本文主要介绍了Golang中Json的序列化和反序列化的使用,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-04-04
  • golang recover函数使用中的一些坑解析

    golang recover函数使用中的一些坑解析

    这篇文章主要为大家介绍了golang recover函数使用中的一些坑解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-02-02
  • Golang Gorm 更新字段save、update、updates

    Golang Gorm 更新字段save、update、updates

    在gorm中,批量更新操作可以通过使用Update方法来实现,本文主要介绍了Golang Gorm 更新字段save、update、updates,具有一定的参考价值,感兴趣的可以了解一下
    2023-12-12
  • golang 将[]byte转成16进制的实现

    golang 将[]byte转成16进制的实现

    这篇文章主要介绍了golang 将[]byte转成16进制的实现,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • Go中的新增对模糊测试的支持

    Go中的新增对模糊测试的支持

    这篇文章主要为大家介绍了Go中的新增对模糊测试的支持,文中还包含了一些功能实验性测试分析有需要的朋友可以借鉴参考下,希望能够有所帮助
    2022-03-03

最新评论