首先,让我说明这func() (interface{})
与 的含义相同func() interface{}
,因此我将使用较短的形式。
传递类型的函数func() interface{}
您可以编写一个带有参数的通用函数,func() interface{}
只要您传递给它的函数具有 type func() interface{}
,如下所示:
type A struct {
Name string
Value int
}
type B struct {
Name1 string
Name2 string
Value float64
}
func doA() interface{} {
return &A{"Cats", 10}
}
func doB() interface{} {
return &B{"Cats", "Dogs", 10.0}
}
func Generic(w io.Writer, fn func() interface{}) {
result := fn()
json.NewEncoder(w).Encode(result)
}
您可以在现场操场上试用此代码:
http://play.golang.org/p/JJeww9zNhE
将函数作为类型参数传递interface{}
如果要编写函数doA
并doB
返回具体类型的值,则可以将所选函数作为 type 的参数传递interface{}
。然后您可以使用该reflect
包func() interface{}
在运行时制作:
func Generic(w io.Writer, f interface{}) {
fnValue := reflect.ValueOf(f) // Make a concrete value.
arguments := []reflect.Value{} // Make an empty argument list.
fnResults := fnValue.Call(arguments) // Assume we have a function. Call it.
result := fnResults[0].Interface() // Get the first result as interface{}.
json.NewEncoder(w).Encode(result) // JSON-encode the result.
}
更简洁:
func Generic(w io.Writer, fn interface{}) {
result := reflect.ValueOf(fn).Call([]reflect.Value{})[0].Interface()
json.NewEncoder(w).Encode(result)
}
完整程序:
包主
import (
"encoding/json"
"io"
"os"
"reflect"
)
type A struct {
Name string
Value int
}
type B struct {
Name1 string
Name2 string
Value float64
}
func doA() *A {
return &A{"Cats", 10}
}
func doB() *B {
return &B{"Cats", "Dogs", 10.0}
}
func Generic(w io.Writer, fn interface{}) {
result := reflect.ValueOf(fn).Call([]reflect.Value{})[0].Interface()
json.NewEncoder(w).Encode(result)
}
func main() {
Generic(os.Stdout, doA)
Generic(os.Stdout, doB)
}
现场游乐场:
http://play.golang.org/p/9M5Gr2HDRN