Go語言之接口interfance

一. 接口

1. 概述

  • 接口類型具體描述了一系列方法的集合
  • 接口類型是一個抽象的類型,不會暴露出他代表的對象內(nèi)部值的結(jié)構(gòu)和對這個對象的支持的基礎(chǔ)操作集合,他只會展示出他們自己的方法。接口類型不能將其實例化

2. 接口的使用

2.1 接口的定義
type Humaner interfance{
    SayHi()
}
  • 接口里面的方法只有聲明沒有實現(xiàn),由其他的自定義類型實現(xiàn)
  • 接口的命名習慣以er結(jié)尾
  • 接口可以匿名嵌入其他接口或者嵌入到結(jié)構(gòu)中
2.2 接口的實現(xiàn)
package main

import "fmt"

type Humaner interface {
    SayHi()
}

type Student struct {
    name string
    id int
}

func (s *Student)SayHi()  {
    fmt.Printf("Student %s SayHi ", s.name)
}



type Teacher struct {
    name string
    age int
}

func (t *Teacher)SayHi()  {
    fmt.Printf("Teacher %s SayHi ", t.name)
}




func main() {

    var i Humaner
    //只要實現(xiàn)了此接口方法類型,那么該類型的變量(或者接收者類型)就可以給i賦值
    s := &Student{"mike" , 20}
    i = s
    i.SayHi()


    t := &Teacher{"ricky" , 30}
    i = t
    t.SayHi()
}


/*
    Student mike SayHi 
    Teacher ricky SayHi 
*/

3. 接口的組合

3.1 接口嵌入

package main

import "fmt"

type Humaner interface {
    SayHi()
}


type Personer interface {
    Humaner   //匿名字段 繼承了Humaner接口
    Sing(lrc string)
}

type Student struct {
    name string
    id int
}
//Student 實現(xiàn)了該方法
func (s *Student)SayHi()  {
    fmt.Printf("Student %s SayHi \n", s.name)
}


func (s *Student)Sing(lrc string)  {
    fmt.Printf("Student %s Sing %s \n", s.name,lrc)
}

func main() {
    var i Personer
    s := &Student{"mike" , 66}
    i = s
    i.SayHi()
    i.Sing("miao miao miao")
}
3.2 接口轉(zhuǎn)化
  • 超集(Personer)可以轉(zhuǎn)化為子集(Humaner),但是子集(Humaner)不能轉(zhuǎn)化為超集(Personer)
func main() {

    var iPro Personer  //超集
    iPro = &Student{"mike" , 66}
    var i Humaner  //子集

    i = iPro  //可以的  超集可以為子集
    i.SayHi()
}

4. 空接口

  • 不包含任何方法的接口是空接口
  • ==所以的類型都實現(xiàn)了空接口==
    var v1 interface{} = 1   //把int類型賦值給interface{}
    var v2 interface{} = "abc" //把string類型賦值給interface{}
    var v3 interface{} = &v2 //把*interface{}類型賦值給interface{}
    var v4 interface{} = struct {
        X int
    }{1}  //把int類型賦值給interface{}
  • 空接口可以存儲任意類型的數(shù)值
  • 當函數(shù)需要接受任意對象實例的時候,我們可以申明為空接口interface{}

5. 類型查詢

5.1 comma-ok斷言
package main

import (
    "fmt"
)

type Student struct {
    name string
}


func main() {
    i := make([]interface{} , 3)
    i[0] = 1
    i[1] = "hello"
    i[2] = Student{"mike" }

    //類型查詢
    for index , data := range i {
        //判斷Value是不是int類型, 第一個返回的是值 第二個返回的結(jié)果
        if value , ok  := data.(int) ; ok == true {
            fmt.Printf("x [%d] 類型為int , 內(nèi)容為%d \n" , index , value)
        }else if value , ok  := data.(string) ; ok == true {
            fmt.Printf("x [%d] 類型為string , 內(nèi)容為 %s \n" , index , value)
        }else if value , ok  := data.(Student) ; ok == true {
            fmt.Printf("x [%d] 類型為string , 內(nèi)容為%s \n" , index , value.name)
        }

    }

}

5.2 switch測試
    for index , data := range i {
        switch t := data.(type) {
        case int:
            fmt.Printf("x [%d] 類型為int , 內(nèi)容為%d \n" , index , t)

        case string:
            fmt.Printf("x [%d] 類型為int , 內(nèi)容為%s \n" , index , t)

        case Student:
            fmt.Printf("x [%d] 類型為int , 內(nèi)容為%s \n" , index , t.name)
        }
    }
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1.ios高性能編程 (1).內(nèi)層 最小的內(nèi)層平均值和峰值(2).耗電量 高效的算法和數(shù)據(jù)結(jié)構(gòu)(3).初始化時...
    歐辰_OSR閱讀 30,286評論 8 265
  • 書名似乎很俗氣,但真真是我今年讀過的最受裨益的一本書了。我保證,當你讀完此書并且按其所說去整理你的生活,真的可以...
    1704海宇姣閱讀 376評論 0 1
  • 有時候我以為我融入了一個圈子,和所有人保持著良好的關(guān)系,以為是朋友,感覺到家人的溫暖,我們嬉戲玩樂,突然發(fā)現(xiàn),原來...
    MonsterJW閱讀 278評論 1 0

友情鏈接更多精彩內(nèi)容