type <Example> interface{
<method>() <rtype>
...
}
interface是一種類型,更準確的說,interface是一個擁有方法的抽象類型。
Go語言允許不帶任何方法的interface,這種類型的接口叫做interface。
Go在抽象類型的實現採用鴨子模式,如果有個動物長得像鴨子,叫得像鴉子,走起來也像鴨子,那牠就是鴨子。若有一個結構體實現了interface的所有方法,它也就實現了該接口。所有結構體都實現了emptyinterface,因為任何類型至少實現了0個方法。
// 定義People接口
type People interface {
Get() int
Set(int)
}
// Person 結構體實現 People 接口
type Person struct {
Age int
}
func(p Person) Get()int {
return p.Age
}
func(p *Person) Set(age int) {
p.Age = age
}
func foo(p People){
p.Set(10)
fmt.Println(p.Get())
}
func main() {
p := Person{}
foo(&p)
}
上面的代碼定義了 People接口,並且實作一個Person結構體實現People接口,接口的重要性體現在函數foo的調用上,在函數調用時Go語言會自動進行類型的轉換,假如結構體實現了多個接口,Go也會在調用時將結構體的類型轉換成相應的接口類型。
當一個接口被多個類型實現時,有時候我們需要區分接口的變量究竟存儲哪種類型的值。
此時我們可以使用
value, ok := <variable>.(*<struct name>)
的方式做為判斷依據,當ok為true時表示變數儲存的是該struct類型的值,這種區分方式稱為 Type assertions。
當我們需要區分多種類型時,則可以使用switch case語法。
interface{}是一個空的 interface 類型,我們知道所有的類型在實現了空的interface,因此當我們求義一個函數的參數為 interface{}類型,該函數就可以接受任何類型作為它的參數。
func doSomething(interface{}){
}