問題:
是否可以動態建立一個實作預定義介面的函數去使用反射?
答案:
在 Go 的原始版本中,不可能透過反射來創建帶有附加方法的新類型。然而,隨著 Go 1.5 的發布,引入了reflect.FuncOf 和reflect.MakeFunc 函數來滿足這一確切需求。
這些函數可讓您定義函數類型並建立遵循該類型的函數值type:
funcType := reflect.FuncOf([]reflect.Type{reflect.TypeOf("")}, []reflect.Type{reflect.TypeOf("")}) fn := reflect.MakeFunc(funcType, func(args []reflect.Value) []reflect.Value { ... })
reflect.MakeFunc的第一個參數是函數類型,而第二個參數是實現該函數的函數值type.
在給定範例的上下文中:
type MyService interface { Login(username, password string) (sessionId int, err error) HelloWorld(sessionId int) (hi string, err error) }
您可以建立一個使用反射實作此介面的函數,如下所示:
fn := reflect.MakeFunc(reflect.TypeOf((*MyService)(nil)).Elem(), func(args []reflect.Value) []reflect.Value { switch args[0].String() { case "Login": return []reflect.Value{ reflect.ValueOf(1), reflect.ValueOf(nil), } case "HelloWorld": return []reflect.Value{ reflect.ValueOf("Hello, world!"), reflect.ValueOf(nil), } } return []reflect.Value{ reflect.Value{}, reflect.ValueOf(errors.New("Method not found")), } })
此實作使用switch 語句根據第一個參數決定要呼叫介面的哪個方法。然後它會傳回輸出參數的適當值。
以上是Go的反射可以創建實現預定義介面的函數嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!