最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

GO語言中接口和接口型函數(shù)的具體使用

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

前言

今天在編碼中,看到了一個(gè)非常經(jīng)典的接口用法如下,于是查閱了相關(guān)資料,發(fā)現(xiàn)此種寫法為接口型函數(shù),本文對(duì)此做了細(xì)致的闡述。

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

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

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

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

GO語言中,接口的實(shí)現(xiàn)是隱式的。接口實(shí)現(xiàn)要綁定在一個(gè)類型上面,通過實(shí)現(xiàn)類型的方法,來隱式的實(shí)現(xiàn)接口,實(shí)現(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
}

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

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

調(diào)用此函數(shù)時(shí),就可以先聲明實(shí)現(xiàn)了此接口的數(shù)據(jù)結(jié)構(gòu),然后調(diào)用函數(shù)即可:

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

調(diào)用后即可產(chǎn)生結(jié)果:

Hello, world!
64

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

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

type MyInterface interface {
?? ?Method1() string
}

type MyInterfaceFunc func()string

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

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

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

使用普通函數(shù)進(jìn)行調(diào)用:

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

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

使用匿名函數(shù)進(jìn)行調(diào)用:

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

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

dog dog !
hello!

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

GO源碼例子

net/http 的 Handler 和 HandlerFunc 就是一個(gè)典型的接口型函數(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來對(duì)經(jīng)典的映射路徑和處理函數(shù)進(jìn)行映射:

func Handle(pattern string, handler Handler)

觀察這個(gè)函數(shù),可以發(fā)現(xiàn)跟上文的例子很類似,這里的handler就是接口類型,然后在HandlerFunc的基礎(chǔ)上做了實(shí)現(xiàn),那么我們可以進(jì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)
}

運(yùn)行起來后,就會(huì)監(jiān)聽localhost:8000并運(yùn)行home函數(shù)。這里將home進(jìn)行類型轉(zhuǎn)換為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)
}

可以達(dá)到同樣的效果。

到此這篇關(guān)于GO語言中接口和接口型函數(shù)的具體使用的文章就介紹到這了,更多相關(guān)GO語言接口和接口型函數(shù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Go語言之結(jié)構(gòu)體與方法

    Go語言之結(jié)構(gòu)體與方法

    這篇文章主要介紹了Go語言之結(jié)構(gòu)體與方法,結(jié)構(gòu)體是由一系列具有相同類型或不同類型的數(shù)據(jù)構(gòu)成的數(shù)據(jù)集合。下面我們就一起來學(xué)習(xí)什么是Go語言之結(jié)構(gòu)體
    2021-10-10
  • Go語言colly框架的快速入門

    Go語言colly框架的快速入門

    Python?中非常知名的爬蟲框架有Scrapy,Go?中也有一些?star?數(shù)較高的爬蟲框架,colly就是其中的佼佼者,它?API?簡(jiǎn)潔,性能優(yōu)良,開箱即用,今天就來快速學(xué)習(xí)一下吧
    2023-07-07
  • 加速開發(fā):使用Go語言和Gin框架構(gòu)建Web項(xiàng)目的利器

    加速開發(fā):使用Go語言和Gin框架構(gòu)建Web項(xiàng)目的利器

    Go語言和Gin框架是構(gòu)建高性能Web項(xiàng)目的利器,Go語言的簡(jiǎn)潔性和并發(fā)性,以及Gin框架的輕量級(jí)和快速路由能力,使開發(fā)者能夠快速構(gòu)建可靠的Web應(yīng)用程序,需要的朋友可以參考下
    2023-09-09
  • Go語言tunny的workerWrapper使用教程示例

    Go語言tunny的workerWrapper使用教程示例

    這篇文章主要為大家介紹了Go語言tunny的workerWrapper使用教程示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-07-07
  • 如何在golang中使用shopspring/decimal來處理精度問題

    如何在golang中使用shopspring/decimal來處理精度問題

    本文主要介紹了如何在golang中使用shopspring/decimal來處理精度問題,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04
  • Go語言繼承功能使用結(jié)構(gòu)體實(shí)現(xiàn)代碼重用

    Go語言繼承功能使用結(jié)構(gòu)體實(shí)現(xiàn)代碼重用

    今天我來給大家介紹一下在?Go?語言中如何實(shí)現(xiàn)類似于繼承的功能,讓我們的代碼更加簡(jiǎn)潔和可重用,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2024-01-01
  • Golang實(shí)現(xiàn)將視頻按照時(shí)間維度剪切的工具

    Golang實(shí)現(xiàn)將視頻按照時(shí)間維度剪切的工具

    這篇文章主要為大家詳細(xì)介紹了如何利用Golang實(shí)現(xiàn)將視頻按照時(shí)間維度進(jìn)行剪切,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起了解一下
    2022-12-12
  • Go 類型轉(zhuǎn)化工具庫(kù)cast函數(shù)詳解

    Go 類型轉(zhuǎn)化工具庫(kù)cast函數(shù)詳解

    這篇文章主要介紹了Go 類型轉(zhuǎn)化工具庫(kù)cast函數(shù)詳解,cast 是在Github上開源的工具庫(kù),就像他的名字一樣,他為我們提供了非常便捷的類型轉(zhuǎn)化的方法
    2022-07-07
  • 解讀go在遍歷map過程中刪除成員是否安全

    解讀go在遍歷map過程中刪除成員是否安全

    在Go語言中,通過for range遍歷map時(shí)可以安全地刪除當(dāng)前遍歷到的元素,因?yàn)楸闅v過程中的刪除操作不會(huì)影響遍歷的進(jìn)行,但需要注意,遍歷順序是不確定的,刪除元素不會(huì)導(dǎo)致程序錯(cuò)誤,但可能會(huì)影響剩余元素的遍歷順序,在多線程環(huán)境下
    2024-09-09
  • Go標(biāo)準(zhǔn)庫(kù)strconv實(shí)現(xiàn)string類型與其他基本數(shù)據(jù)類型之間轉(zhuǎn)換

    Go標(biāo)準(zhǔn)庫(kù)strconv實(shí)現(xiàn)string類型與其他基本數(shù)據(jù)類型之間轉(zhuǎn)換

    這篇文章主要為大家介紹了Go標(biāo)準(zhǔn)庫(kù)strconv實(shí)現(xiàn)string類型與其他基本數(shù)據(jù)類型之間轉(zhuǎn)換示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-11-11

最新評(píng)論

宿州市| 太谷县| 西盟| 酉阳| 冷水江市| 镇赉县| 永登县| 若羌县| 清镇市| 普兰店市| 建昌县| 庆安县| 肥东县| 泰和县| 台中市| 即墨市| 明光市| 丹棱县| 隆林| 金溪县| 萨嘎县| 溧阳市| 钟山县| 藁城市| 广昌县| 晋江市| 汪清县| 焦作市| 林州市| 资中县| 绥芬河市| 宽甸| 阿克| 华坪县| 柞水县| 九龙县| 万源市| 东宁县| 保德县| 山丹县| 龙山县|