interface

interface是什麼函數

interface被稱爲接口,是一種類型,其本質是一組抽象方法的集合。凡是實現這些抽象方法的對象,均可以被稱爲「實現了這個接口」。其存在乎義是爲了規定對象的一組行爲。code

interface舉例對象

package main

import (
    "fmt"
)

type Singer interface {
    sing()
}

type Man struct {
    lyric string
}

type Bird struct {
    lyric string
}

func (m Man) sing() {
    fmt.Println(m.lyric)
}

func (b Bird) sing() {
    fmt.Println(b.lyric)
}

func main() {
    var in Singer
    in = Man{"I'm a brave man"}
    in.sing()
    in = Bird{"I'm a small bird"}
    in.sing()
}

上述事例中咱們定義了一個名爲Singer的接口,它包含一個抽象方法sing()(固然也能夠包含不少抽象方法)。接着咱們又分別爲Man對象和Bird對象實現了sing()方法,即這兩個對象都實現了Singer接口。因而,這兩種對象就均可以使用Singer接口對應的變量來存儲了!使用這個接口變量就如同調用其對應的對象同樣容易。接口

空interface字符串

interface{} 是一個空interface,實現它不須要實現任何抽象函數,也就是說全部的類型都實現了空interface。因而,一個空interface變量能夠存入任何值。實際的用處是,當不肯定傳入函數的參數類型時,可使用interface{}代替。而且,咱們有特定的語法能夠判斷具體存入interface{}變量的類型。源碼

package main

import (
    "fmt"
    "reflect"
)

type Ele interface{}

type List []Ele

func main() {
    list := make(List, 4)
    list[0] = 1
    list[1] = 'c'
    list[2] = "string"
    list[3] = [2]int{5, 6}
    for index, val := range list {
        switch typeval := val.(type) {
        case int:
            fmt.Printf("list[%d] is an int(%d)\n", index, typeval)
        case string:
            fmt.Printf("list[%d] is a string(%s)\n", index, typeval)
        case rune:
            fmt.Printf("list[%d] is a rune(%c)\n", index, typeval)
        default:
            fmt.Printf("list[%d] is a different type(%s)\n", index, reflect.TypeOf(typeval))
        }
    }
}

注意:這種switch和val.(type)配合的語法是特有的,在switch之外的任何地方都不能使用相似於val.(type)這種形式。string

一個特別的interfaceit

咱們很熟悉的fmt.Println函數中能夠傳入int、string、rune、array等多種類型做爲參數,而控制檯實際輸出的字符串反映了每種類型的值。這就是由於它們都實現了源碼中
Stringer接口,以下。import

type Stringer interface {
     String() string
}

有趣的一點是,當咱們定義一個新的數據類型時,若是也實現了Stringer這個接口,那麼它一樣也能夠被fmt包格式化輸出,而且是按照你所定義的格式。變量

package main

import (
    "fmt"
)

type Man struct {
    name string
    age  int
}

func (m Man) String() (result string) {
    result = fmt.Sprintf("I'm a man. My name is %s and I'm %d years old.\n", m.name, m.age)
    return
}

func main() {
    man := Man{"Bob", 18}
    fmt.Println(man)
}

output:
I'm a man. My name is Bob and I'm 18 years old.
相關文章
相關標籤/搜索