golang基礎--Interface介面

來源:互聯網
上載者:User
  • 介面是一個或多個方法簽名名的集合,定義方式如下
    type Interface_Name interface { method_a() string method_b() int .... }

  • 只要某個類型擁有該介面的所有方法簽名,就算實現該介面,無需顯示聲明實現了那個介面,這稱為structural Typing

    package mainimport "fmt"type USB interface { //定義一個介面:方法的集合    Name() string //Name方法,返回string    Connect()     //Connect方法}type PhoneConnecter struct { //定義一個結構    name string //結構包含一個欄位}func (pc PhoneConnecter) Name() string { //為結構定義一個方法,綁定介面    return pc.name //該方法命名為介面內的欄位} //返回結構體欄位func (pc PhoneConnecter) Connect() { //定義結構體另一個方法,與介面另一個方法綁定    fmt.Println("Connect:", pc.name)}func main() {    var a USB                            //定義一個變數為USB介面類型    a = PhoneConnecter{"PhoneConnecter"} //執行個體化一個結構體,並賦值給變數(介面)USB    a.Connect()                          //介面調用其Connect方法,也是結構方法}/*輸出Connect: PhoneConnecter*/
  • 介面可以作為匿名嵌入其它介面,或嵌入到結構中

    package mainimport "fmt"type USB interface { //定義一個介面:方法的集合    Name() string //Name方法,返回string    Connecter     //嵌入Connecter介面,可以使用Connecter方法}type Connecter interface { //定義另一個介面 Connecter    Connect() //包含一個介面方法:Connect}type PhoneConnecter struct { //定義一個結構    name string //結構包含一個欄位}func (pc PhoneConnecter) Name() string { //為結構定義一個方法,綁定介面    return pc.name //該方法命名為介面內的欄位} //返回結構體欄位func (pc PhoneConnecter) Connect() { //定義結構體另一個方法,與介面另一個方法綁定    fmt.Println("Connect:", pc.name)}func main() {    var a USB                            //定義一個變數為USB介面類型    a = PhoneConnecter{"PhoneConnecter"} //執行個體化一個結構體,並賦值給變數(介面)USB    a.Connect()    Disconnect(a) //介面調用其Connect方法,也是結構方法}
  • 介面只是方法聲明,沒有實現調用,沒有欄位,只能通過綁定的類型方法訪問

    package mainimport "fmt"type USB interface { //定義一個介面:方法的集合    Name() string //Name方法,返回string    Connecter     //嵌入Connecter介面,可以使用Connecter方法}type Connecter interface { //定義另一個介面 Connecter    Connect() //包含一個介面方法:Connect}type PhoneConnecter struct { //定義一個結構    name string //結構包含一個欄位}func (pc PhoneConnecter) Name() string { //為結構定義一個方法,綁定介面    return pc.name //該方法命名為介面內的欄位} //返回結構體欄位func (pc PhoneConnecter) Connect() { //定義結構體另一個方法,與介面另一個方法綁定    fmt.Println("Connected:", pc.name)}func main() {    var a USB                     //定義一個變數為USB介面類型    a = PhoneConnecter{"htc M10"} //執行個體化一個結構體,並賦值給變數(介面)USB    a.Connect()    Disconnect(a) //介面調用其Connect方法,也是結構方法}func Disconnect(usb USB) {    if pc, ok := usb.(PhoneConnecter); ok { //傳入結構體,判斷賦值是否成功        fmt.Println("Disconnected:", pc.name)        return    }    fmt.Println("UNknown device.")}/*輸出Connect: htc M10Disconnect:htc M10*/
  • go沒有像其他語言繼承,如python中的object表示元類,所有的類都繼承自object類,go通過介面也類似實現了此定義,因為只要某個類型實現了某個介面的方法,我們就說此類實現了
    這個介面。 因為type empty interface{}---空介面沒有任何方法,所以可以理解為所有的介面都實現了空介面的方法(繼承)。

    package mainimport "fmt"type USB interface { //定義一個介面:方法的集合    Name() string //Name方法,返回string    Connecter     //嵌入Connecter介面,可以使用Connecter方法}type Connecter interface { //定義另一個介面 Connecter    Connect() //包含一個介面方法:Connect}type PhoneConnecter struct { //定義一個結構    name string //結構包含一個欄位}func (pc PhoneConnecter) Name() string { //為結構定義一個方法,綁定介面    return pc.name //該方法命名為介面內的欄位} //返回結構體欄位func (pc PhoneConnecter) Connect() { //定義結構體另一個方法,與介面另一個方法綁定    fmt.Println("Connected:", pc.name)}func main() {    var a USB                     //定義一個變數為USB介面類型    a = PhoneConnecter{"htc M10"} //執行個體化一個結構體,並賦值給變數(介面)USB    a.Connect()    Disconnect(a) //介面調用其Connect方法,也是結構方法}# func Disconnect(usb interface{}) { //整合空介面,也可以實現#   if pc, ok := usb.(PhoneConnecter); ok { //傳入結構體,判斷賦值是否成功#       fmt.Println("Disconnected:", pc.name)#       return#   }#   fmt.Println("UNknown device.")#   }//通過switch判斷介面類型:type...switch用法func Disconnect(usb interface{}) { //整合空介面,也可以實現switch v := usb.(type) {case PhoneConnecter:    fmt.Println("Disconnected:", v.name)default:    fmt.Println("UNknown device.")}}/*輸出Connect: htc M10Disconnect:htc M10*/
  • 介面間的轉換: 只有子類介面可以轉換為父類介面,因為父類介面包含了子類介面,子類介面可以調用父類介面一部分介面方法

  • 將對象賦值給介面是,會發生拷貝,而介面內部儲存的是只想這個複製品的指標,也就意味著介面無法修改狀態,也無法擷取指標。

    ...func main() {pc := PhoneConnecter{"ipad book pro"} //執行個體化一個結構var a Connecter                       //定義a為介面變數a = Connecter(pc)                     //介面強制轉換a.Connect()pc.name = "Iphone 7"a.Connect().../*輸出pc.name= "ipad book pro"    Connected: ipad book propc.name = "Iphone 7"        Connected: ipad book pro*/}
  • 只有當 介面儲存的類型和對象都為nil時,介面才等於nil

    package mainimport "fmt"func main() {    var a interface{}    fmt.Println(a == nil)    var p *int = nil    a = p    fmt.Println(a == nil)}/*輸出truefalse*/
  • 介面調用不會做Receiver的自動轉換

  • 介面同樣支援匿名欄位的方法

  • 介面也可以實作類別似OOP(物件導向編程)中的多態

  • 空介面可以作為任何類型資料的容器

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.