Go語言之interface-創(chuàng)新互聯(lián)

interface 理論


  • 接口是一個(gè)或多個(gè)方法簽名的集合
  • 只要某個(gè)類型擁有該接口的所有方法簽名,即算實(shí)現(xiàn)該接口,無需顯示聲明實(shí)現(xiàn)了哪個(gè)接口,這稱為Structural Typing
  • 接口只有方法聲明,沒有實(shí)現(xiàn),沒有數(shù)據(jù)字段
  • 接口可以匿名嵌入其他接口,或嵌入到結(jié)構(gòu)中
  • 將對(duì)象賦值給接口時(shí),會(huì)發(fā)生拷貝,而接口內(nèi)部存儲(chǔ)的是指向這個(gè)復(fù)制品的指針,即無法修改復(fù)制品的狀態(tài),也無法獲取指針
  • 只有當(dāng)接口存儲(chǔ)的類型和對(duì)象都為nil時(shí),接口才等于nil
  • 接口調(diào)用不會(huì)做receiver的自動(dòng)轉(zhuǎn)換
  • 接口同樣支持匿名字段方法
  • 接口也可實(shí)現(xiàn)類似OOP中的多態(tài)
  • 空接口可以作為任務(wù)類型數(shù)據(jù)的容器

舉例

1、創(chuàng)建接口

// interface 接口  練習(xí)
//實(shí)現(xiàn)接口的原則就是
//實(shí)現(xiàn)了它定義的方法,就默認(rèn)是實(shí)現(xiàn)了接口
package main

import "fmt"

//聲明一個(gè)接口
type USB interface {
    //聲明方法Name,  并設(shè)置 返回值類型string
    Name() string

    //聲明方法Connect方法,無返回值
    Connect()
}

//聲明一個(gè)類型,在Go語言中,對(duì)應(yīng)的就是struct類型
type PhoneConnector struct {
    //聲明一個(gè)私有屬性
    name string
}
//---------------------聲明完Name,Connector方法后,就是實(shí)現(xiàn)了USB接口了---------------------------
//使用receiver,將類型跟方法進(jìn)行綁定
func (pc PhoneConnector)Name() string{

    return pc.name
}

func (pc PhoneConnector)Connector()  {
    fmt.Println("connected:\t", pc.name)
}

//--------------------------------------------------------------------------------------
func main() {
    a := PhoneConnector{"apple"}
    fmt.Println("Name:\t", a.Name())
    a.Connector()
}

2、接口之間的嵌套 練習(xí)

//interface 嵌套  練習(xí)測試
package main

import "fmt"

//定義一個(gè)空的接口
//這樣的話,所有的類,都默認(rèn)實(shí)現(xiàn)了這個(gè)接口,因?yàn)樗鼪]有方法
//定義的空接口,就相當(dāng)于定義了一 個(gè)Object對(duì)象,最高層
//都是它的子類了,就沒有任何限制了
type nullEmpty interface {

}

// 定義一個(gè)  父接口
type HOME interface {
    //這個(gè)接口里,只定義一個(gè)方法
    Name() string
}

//再定義一個(gè)接口, 這相當(dāng)于是子接口了
type MyHome interface {
    Show() string
    //這樣就嵌套了 一個(gè)接口
    HOME
}

//聲明一個(gè)結(jié)構(gòu)類型
type BeijingHome struct {
    name string
}

//-----------開始創(chuàng)建方法method-----
func (info BeijingHome)Show(){
    fmt.Println("Show()--->info.name:\t", info.name)
}

func (info BeijingHome)Name() string{

    return info.name
}

func main() {
    a := BeijingHome{"yihuyuan"}

    fmt.Println("name:\t", a.Name())
    a.Show()

    //------下面演示一下,上面理論中說的---復(fù)制品的問題----
    b := a
    b.name = "lenovo" //修改后,并沒有修改a里的值
    b.Show()

    Disconnect(a)
    Disconnect2(a)
}

//設(shè)計(jì)一個(gè)簡單的類型斷言
func Disconnect(home HOME){
    if pc, ok := home.(BeijingHome); ok{
        fmt.Println("Disconnected:\t", pc.name)
        return
    }
    fmt.Println("Unknown decive.")
}

//設(shè)計(jì)一個(gè)簡單的類型斷言
//傳入的參數(shù),是,空接口
//實(shí)際上,對(duì)于傳入的參數(shù),就沒有限制了
func Disconnect2(home interface{}){
    //對(duì)Disconnect()方法,進(jìn)行改造,
    //因?yàn)?,傳入的參?shù)是頂層,相當(dāng)于Java里的Object,沒有任何限制
    //類型,需要自己判斷
    switch v := home.(type) {
    case BeijingHome:
        fmt.Println("Disconnected:\t", v.name)
    default:
        fmt.Println("Unknown decive.")
    }

}

3、不同接口之間的轉(zhuǎn)換

//不同接口之間的轉(zhuǎn)換,類似于Java中的向上轉(zhuǎn)型,或者向下轉(zhuǎn)型
//就是說,有兩個(gè)接口A, B
//其中,A接口里,嵌入了B
//那么A接口可以轉(zhuǎn)換成B接口,但是,B接口不能轉(zhuǎn)換成A接口,因?yàn)?//A接口里,可能包含B接口里沒有的方法
//也就是說,多的可以向少的轉(zhuǎn)換,反之不可。
package main

import "fmt"

type USB2 interface {
    Name() string
    Connecter
}

type Connecter interface {
    Connect()
}

type PcConnecter struct {
    name string
}

func (pcConnecter PcConnecter)Name() string {
    return pcConnecter.name
}

func(pcConnecter PcConnecter)Connect() {
    fmt.Println("Connected:\t", pcConnecter.name)
}

func main() {
    pc := PcConnecter{"appleConnector"}
    var a Connecter
    //將USE2 類型,強(qiáng)制 轉(zhuǎn)換成了Connecter類型
    a = Connecter(pc)
    a.Connect()

    //------驗(yàn)證----只有當(dāng)接口存儲(chǔ)的類型和對(duì)象都為nil時(shí),接口才等于nil
    //聲明一個(gè)空接口, 也沒有賦值,就是nil
    var aa interface{}
    fmt.Println( aa == nil)  // aa 本身就是一個(gè)nil,啥也沒存

    //變量p, 是一個(gè)指向int類型的指針
    //直接初始化為nil
    var p *int = nil
    aa = p //aa 指向p
    fmt.Println( aa == nil)
}

創(chuàng)新互聯(lián)www.cdcxhl.cn,專業(yè)提供香港、美國云服務(wù)器,動(dòng)態(tài)BGP最優(yōu)骨干路由自動(dòng)選擇,持續(xù)穩(wěn)定高效的網(wǎng)絡(luò)助力業(yè)務(wù)部署。公司持有工信部辦法的idc、isp許可證, 機(jī)房獨(dú)有T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確進(jìn)行流量調(diào)度,確保服務(wù)器高可用性。佳節(jié)活動(dòng)現(xiàn)已開啟,新人活動(dòng)云服務(wù)器買多久送多久。

成都創(chuàng)新互聯(lián)服務(wù)緊隨時(shí)代發(fā)展步伐,進(jìn)行技術(shù)革新和技術(shù)進(jìn)步,經(jīng)過10年的發(fā)展和積累,已經(jīng)匯集了一批資深網(wǎng)站策劃師、設(shè)計(jì)師、專業(yè)的網(wǎng)站實(shí)施團(tuán)隊(duì)以及高素質(zhì)售后服務(wù)人員,并且完全形成了一套成熟的業(yè)務(wù)流程,能夠完全依照客戶要求對(duì)網(wǎng)站進(jìn)行成都網(wǎng)站制作、做網(wǎng)站、建設(shè)、維護(hù)、更新和改版,實(shí)現(xiàn)客戶網(wǎng)站對(duì)外宣傳展示的首要目的,并為客戶企業(yè)品牌互聯(lián)網(wǎng)化提供全面的解決方案。

新聞標(biāo)題:Go語言之interface-創(chuàng)新互聯(lián)
URL標(biāo)題:http://bm7419.com/article24/iphce.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供靜態(tài)網(wǎng)站、虛擬主機(jī)品牌網(wǎng)站建設(shè)、自適應(yīng)網(wǎng)站、面包屑導(dǎo)航、定制開發(fā)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

h5響應(yīng)式網(wǎng)站建設(shè)