1. 程式人生 > 實用技巧 >Go 的語言介面

Go 的語言介面

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的Call
func (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介面的方法也全部實現