Go 的語言介面
阿新 • • 發佈:2020-08-06
1.介面本身不能建立例項,但是可以指向一個實現了該介面的自定義型別的變數(例項),自定義型別可以是函式也可以是結構體(如果自定義的型別沒有實現介面,就不能將結構體賦給介面)
package main import ( "fmt" ) // 結構體型別 type Struct struct { } // 實現Invoker的Call func (s *Struct) Call(p interface{}) { fmt.Println("from struct", p) } // 呼叫器介面 type Invoker interface { // 需要實現一個Call()方法 Call(interface{}) } func main() { // 宣告介面變數 var invoker Invoker // 例項化結構體 // s := new(Struct) var s Struct // 將例項化的結構體賦值到介面 invoker = &s // 使用介面呼叫例項化結構體的方法Struct.Call invoker.Call("hello") } 如果是函式型別 package main import ( "fmt" ) // 函式定義為型別 type FuncCaller func(interface{}) // 實現Invoker的Callfunc (f FuncCaller) Call(p interface{}) { // 呼叫f()函式本體 f(p) } // 呼叫器介面 type Invoker interface { // 需要實現一個Call()方法 Call(interface{}) } func main() { // 宣告介面變數 var invoker Invoker // 將匿名函式轉為FuncCaller型別, 再賦值給介面 invoker = FuncCaller(func(v interface{}) { fmt.Println("from function", v) }) // 使用介面呼叫FuncCaller.Call, 內部會呼叫函式本體 invoker.Call("hello") }
2.介面中所有的方法都沒有方法體,即都是沒有實現的方法
3.一個自定義型別需要將某個介面的所有方法都實現,我們說這個自定義型別實現了該介面,如果沒有全部實現會報not implement所有函式的錯
4.一個自定義的型別可以實現多個介面
5.介面中不能有其他變數
6.interface型別預設是一個指標(引用型別),如果沒有對interface初始化就使用,那麼會輸出nil
7.可以將任何型別的變數賦給interface{}
8.一個介面(比如A介面)可以繼承多個別的介面(比如B,C介面),這時如果要實現A介面,也必須將B,C介面的方法也全部實現