91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

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

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

GO語言中接口和接口型函數如何使用

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

這篇文章主要講解了“GO語言中接口和接口型函數如何使用”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“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語言中接口和接口型函數如何使用這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

向AI問一下細節

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

AI

藁城市| 彝良县| 大港区| 米林县| 高陵县| 中阳县| 平和县| 安达市| 阳原县| 澳门| 温宿县| 甘孜| 怀化市| 绥棱县| 天峻县| 洞头县| 望谟县| 交城县| 永川市| 秀山| 广饶县| 中宁县| 海淀区| 平度市| 日土县| 高雄市| 海伦市| 浙江省| 峨眉山市| 西贡区| 改则县| 赤水市| 象州县| 独山县| 临澧县| 湖口县| 松江区| 达日县| 安化县| 穆棱市| 当雄县|