溫馨提示×

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

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Go語言中的接口怎么使用

發(fā)布時(shí)間:2022-12-05 09:14:03 來源:億速云 閱讀:198 作者:iii 欄目:開發(fā)技術(shù)

今天小編給大家分享一下Go語言中的接口怎么使用的相關(guān)知識(shí)點(diǎn),內(nèi)容詳細(xì),邏輯清晰,相信大部分人都還太了解這方面的知識(shí),所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。

    接口

    Go 語言中,接口是一種抽象的類型,是一組方法的集合。接口存在的目的是定義規(guī)范,而規(guī)范的細(xì)節(jié)由其他對(duì)象去實(shí)現(xiàn)。我們來看一個(gè)例子:

    import "fmt"
    
    type Person struct {
        Name string
    }
    
    func main() {
        person := Person{Name: "cmy"}
        fmt.Println(person) // {cmy}
    }

    上述代碼定義了結(jié)構(gòu)體 Person ,main 函數(shù)創(chuàng)建了此結(jié)構(gòu)體的變量 person,然后通過 fmt 包里的 Println 函數(shù)打印這個(gè)結(jié)構(gòu)體,打印結(jié)果為 {cmy}。在此基礎(chǔ)上,我們改造一下代碼:

    import "fmt"
    
    type Person struct {
        Name string
    }
    
    func (p Person) String() string {
        return fmt.Sprintf("name: %s", p.Name)
    }
    
    func main() {
        person := Person{Name: "cmy"}
        fmt.Println(person) // name: cmy
    }

    新改造的代碼里為結(jié)構(gòu)體 Person 添加一個(gè)結(jié)構(gòu)體方法 String() string,方法的返回結(jié)果是對(duì) name 進(jìn)行格式化,我們?cè)俅蛴∫幌陆Y(jié)構(gòu)體,觀察結(jié)果發(fā)現(xiàn)是 String() 方法返回的值,而不是 {cmy}。 為什么是這樣呢?這是因?yàn)?fmt.Println(T) 函數(shù)的實(shí)現(xiàn)細(xì)節(jié)里,會(huì)對(duì)結(jié)構(gòu)體進(jìn)行判斷,如果結(jié)構(gòu)體實(shí)現(xiàn)了 Stringer 接口,則會(huì)直接打印 String() 方法的返回值。以下是 Stringer 接口的代碼:

    type Stringer interface {
        String() string
    }

    結(jié)構(gòu)體實(shí)現(xiàn)了這個(gè)接口,也就意味著遵守這個(gè)接口所定義的規(guī)范,fmt.Println(T) 函數(shù)發(fā)現(xiàn)結(jié)構(gòu)體有這個(gè)規(guī)范,因此就會(huì)根據(jù)規(guī)范來打印信息?;?Stringer 接口,我們來看看接口的語法格式:

    type XXX interface {
        // methods
    }

    1、type

    接口的聲明,必須以 type 關(guān)鍵字開頭。

    2、接口名

    推薦駝峰式命名法,首字母大寫的方法名可以在包外訪問,小寫的只能在包內(nèi)訪問。

    3、interface

    接口的標(biāo)識(shí)。

    4、接口體

    大括號(hào)里面聲明規(guī)范,也就是聲明方法,方法必須具有名字。

    接口的實(shí)現(xiàn)

    Go 語言里,接口的實(shí)現(xiàn)不是基于接口,而是基于方法。如果一個(gè)自定義類型擁有了某個(gè)接口的所有方法,那么這個(gè)自定義類型就實(shí)現(xiàn)這個(gè)接口。接口的實(shí)現(xiàn)在上述的例子中有所體現(xiàn),Person 結(jié)構(gòu)體定義了 String() string 方法,擁有了 Stringer 接口的所有方法,因此實(shí)現(xiàn)了 Stringer 接口。

    一個(gè)自定義類型可以實(shí)現(xiàn)多個(gè)接口

    type A interface {
            a()
    }
    
    type B interface {
            b()
    }
    type Person struct {
            Name string
    }
    
    func (p Person) a() {
    }
    
    func (p Person) b() {
    }

    A 接口聲明了 a 方法, B 接口聲明了 b 方法,Person 結(jié)構(gòu)體定義了 ab 兩個(gè)方法,因此 Person 結(jié)構(gòu)體實(shí)現(xiàn)了 AB 兩個(gè)接口。

    接口類型變量

    一旦接口被定義,它就可以用于聲明變量。

    import "fmt"
    
    type A interface {
    }
    
    func main() {
        var a A
        fmt.Println(a) // <nil>
    }

    如果只聲明接口變量,不初始化,變量的值默認(rèn)為 nil,因?yàn)榻涌陬愋蛯?shí)際上是一個(gè)指針。若為接口賦初值,需要選擇一個(gè)合法的值,即被賦值的基類必須實(shí)現(xiàn)這個(gè)接口。

    空接口

    Go 語言里面可以認(rèn)為所有類型實(shí)現(xiàn)了空接口,因?yàn)榭战涌跊]有任何的方法。

    import "fmt"
    
    type EmptyInterface interface {
    }
    
    func main() {
        var a EmptyInterface = 1
        var b EmptyInterface = true
        var c EmptyInterface = "hello"
        var d EmptyInterface = 3.14
        var e EmptyInterface = 'c'
        fmt.Println(a, b, c, d, e) // 1 true hello 3.14 99
    }

    所有類型都實(shí)現(xiàn)空接口,因此空接口變量可以被賦初值為任意類型的值或變量。

    類型斷言

    Go 語言支持類型斷言操作,通過這個(gè)操作,可以還原接口變量的右值(被賦的初值)。類型斷言的語法形式通常為:

    v, ok := a.(T)

    如果斷言成功,那么 v 的值為接口變量的值,ok 的值為 true;如果斷言失敗,v 的值為 T 類型的零值,ok 的值為 false。

    類型斷言變種 type switch

    通過 type switch 的方式,可以判斷接口變量屬于哪種動(dòng)態(tài)類型。

    import "fmt"
    
    type EmptyInterface interface {
    }
    
    func main() {
        var a EmptyInterface = 1
        switch a.(type) {
        case string:
    	fmt.Println("a 的右值類型為 string")
        case int:
    	fmt.Println("a 的右值類型為 int")
        case bool:
    	fmt.Println("a 的右值類型為 bool")
        case float64:
    	fmt.Println("a 的右值類型為 float64")
        }
    }

    以上就是“Go語言中的接口怎么使用”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會(huì)為大家更新不同的知識(shí),如果還想學(xué)習(xí)更多的知識(shí),請(qǐng)關(guān)注億速云行業(yè)資訊頻道。

    向AI問一下細(xì)節(jié)

    免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

    AI