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.