欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

GO語言中接口和接口型函數的具體使用

 更新時間:2023年03月09日 08:25:26   作者:雨雨不怕雨  
本文主要介紹了GO語言中接口和接口型函數的使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

前言

今天在編碼中,看到了一個非常經典的接口用法如下,于是查閱了相關資料,發(fā)現此種寫法為接口型函數,本文對此做了細致的闡述。

// 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)

觀察這個函數,可以發(fā)現跟上文的例子很類似,這里的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)
}

運行起來后,就會監(jiān)聽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語言接口和接口型函數內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Mac上Go環(huán)境和VS Code的正確安裝與配置方法

    Mac上Go環(huán)境和VS Code的正確安裝與配置方法

    Go語言是一個新興的語言。下面介紹一下如何在Mac系統(tǒng)下安裝和使用這個語言,Go語言提供了mac下安裝包,可直接下載安裝包點擊安裝
    2018-03-03
  • Golang學習筆記(一):簡介

    Golang學習筆記(一):簡介

    這篇文章主要介紹了Golang學習筆記(一):簡介,本文講解了Go語言最主要的特性、安裝、環(huán)境變量設置、整體目錄結構、Helloworld、go命令、調試、編輯器設置等內容,需要的朋友可以參考下
    2015-05-05
  • Golang中深拷貝與淺拷貝詳解

    Golang中深拷貝與淺拷貝詳解

    這篇文章主要為大家詳細介紹一下Golang深拷貝和淺拷貝,文中有詳細的代碼示例供大家參考,需要的可以參考一下
    2023-05-05
  • GoLang使goroutine停止的五種方法實例

    GoLang使goroutine停止的五種方法實例

    goroutine是Go并行設計的核心,下面這篇文章主要給大家介紹了關于GoLang使goroutine停止的五種方法,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-07-07
  • Golang遞歸獲取目錄下所有文件方法實例

    Golang遞歸獲取目錄下所有文件方法實例

    這篇文章主要給大家介紹了關于Golang遞歸獲取目錄下所有文件的相關資料,文中通過實例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2023-02-02
  • 深度解密 Go 語言中的 sync.map

    深度解密 Go 語言中的 sync.map

    這篇文章主要介紹了深度解密 Go 語言中的 sync.map,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-06-06
  • GO中對map排序的實現

    GO中對map排序的實現

    本文主要介紹了GO中對map排序的實現,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-03-03
  • Go設計模式之中介者模式講解和代碼示例

    Go設計模式之中介者模式講解和代碼示例

    中介者是一種行為設計模式,讓程序組件通過特殊的中介者對象進行間接溝通,達到減少組件之間依賴關系的目的,因此本文就給大家詳細介紹一下Go中介者模式,需要的朋友可以參考下
    2023-06-06
  • Go語言的變量定義詳情

    Go語言的變量定義詳情

    這篇文章主要介紹了Go語言的變量定義詳情,go定義變量的方式和c,c++,java語法不一樣,var?變量名類型,var在前,變量名在中間,類型在后面,下文更多詳細內容需要的小伙伴可以參考一下
    2022-03-03
  • Go 語言中 20 個占位符的整理

    Go 語言中 20 個占位符的整理

    這篇文章主要介紹了Go 語言中 20 個占位符的整理,看完本篇文章講學會什么是占位符?哪些函數支持?如何使用占位符?不同的占位符的作用?配合占位符的幾個標記符號用法?
    2021-10-10

最新評論