其他類型能夠實現接口,函數也可以,本節將對結構體與函數實現接口的過程進行對比。
完整的代碼:
package main import "fmt" /* 這個接口需要實現 Call() 方法,調用時會傳入一個 interface{} 類型的變量,這種類型的變量表示任意類型的值。 */ type Invoker interface { //調用器接口 Call(interface{}) } /* 定義結構體,該例子中的結構體無須任何成員,主要展示實現 Invoker 的方法。 */ type Struct struct { } /* Call() 為結構體的方法,該方法的功能是打印 from struct 和傳入的 interface{} 類型的值。 */ func (s *Struct) Call(p interface{}) { fmt.Println("from struct", p) } //函數定義為類型 type FuncCaller func(interface{}) /* 將 func(v interface{}){} 匿名函數轉換為 FuncCaller 類型(函數簽名才能轉換),此時 FuncCaller 類型實現了 Invoker 的 Call() 方法,賦值給 invoker 接口是成功的 */ func (f FuncCaller) Call(p interface{}) { f(p) } func main() { //聲明接口變量 var invoker Invoker /* 使用 new 將結構體實例化,此行也可以寫為 s:=&Struct。 */ s := new(Struct) //將實例化的結構體賦值到接口 invoker = s //使用接口調用實例化結構體方法 invoker.Call("hello") //將匿名函數轉為FuncCaller類型,再賦值給接口 invoker = FuncCaller(func(v interface{}) { fmt.Println("from function", v) }) //使用接口調用FuncCaller.Call,內部會調用 函數主體 invoker.Call("hello") }
程序輸出:
from struct hello from function hello