溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

GO語言中接口和接口型函數(shù)如何使用

發(fā)布時間:2023-03-09 09:50:53 來源:億速云 閱讀:76 作者:iii 欄目:開發(fā)技術

這篇文章主要講解了“GO語言中接口和接口型函數(shù)如何使用”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“GO語言中接口和接口型函數(shù)如何使用”吧!

// 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語言中的接口怎么用?

以上的例程中,首先定義了一個接口,隨后定義了一個函數(shù)類型實現(xiàn)了此接口,那么GO語言中的接口到底怎么使用呢?

在GO語言中,接口是一種類型,它定義了一組方法的組合,但沒有具體的代碼實現(xiàn),接口定義示例如下:

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

GO語言中,接口的實現(xiàn)是隱式的。接口實現(xiàn)要綁定在一個類型上面,通過實現(xiàn)類型的方法,來隱式的實現(xiàn)接口,實現(xiàn)示例如下:

type MyType struct {
    // type fields
}

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

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

實現(xiàn)接口后,我們可以把接口作為參數(shù)傳入某個函數(shù)中,這樣實現(xiàn)了接口的不同數(shù)據結構就可以都作為接口傳入函數(shù)中了:

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

調用此函數(shù)時,就可以先聲明實現(xiàn)了此接口的數(shù)據結構,然后調用函數(shù)即可:

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

調用后即可產生結果:

Hello, world!
64

使用函數(shù)類型實現(xiàn)接口有何好處?

以上是使用的結構體隱式實現(xiàn)了接口,還可以自定義函數(shù)類型來隱式實現(xiàn)接口。這樣可以使用匿名函數(shù)或者普通函數(shù)(都需要類型轉換)直接作為接口參數(shù)傳入函數(shù)中。接口及實現(xiàn)如下:

type MyInterface interface {
    Method1() string
}

type MyInterfaceFunc func()string

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

定義一個以接口為參數(shù)的函數(shù):

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

使用普通函數(shù)進行調用:

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

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

使用匿名函數(shù)進行調用:

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

可以看到,最終的輸出都是正確的:

dog dog !
hello!

總的來說,大大的增加了代碼的可擴展性,如果沒有接口型函數(shù)的話,那么想要實現(xiàn)一個新的函數(shù),就需要聲明新的類型(如結構體),再隱式的實現(xiàn)接口,再傳入MyFunction函數(shù)中。有了接口型函數(shù)后,那么只需要實現(xiàn)核心邏輯,隨后將函數(shù)轉換為預期的類型即可直接傳入。

GO源碼例子

net/http 的 Handler 和 HandlerFunc 就是一個典型的接口型函數(shù)的例子,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來對經典的映射路徑和處理函數(shù)進行映射:

func Handle(pattern string, handler Handler)

觀察這個函數(shù),可以發(fā)現(xiàn)跟上文的例子很類似,這里的handler就是接口類型,然后在HandlerFunc的基礎上做了實現(xiàn),那么我們可以進行如下的使用:

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函數(shù)。這里將home進行類型轉換為http.HandlerFunc再作為接口類型傳入http.Handle,非常的方便。

我們同樣可以使用匿名函數(shù)的形式:

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語言中接口和接口型函數(shù)如何使用”的內容了,經過本文的學習后,相信大家對GO語言中接口和接口型函數(shù)如何使用這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI