我正在尝试创建一些通用函数来处理许多不同的对象类型,其中一些类型嵌入了我创建的方便的子类型,称为BaseObject。
我似乎无法弄清楚如何测试“值接口{}”是否包含BaseObject,或者如何然后调用其中的一种方法,例如ToString()...,该方法应返回[TestObject]而不是[BaseObject]
package Test
import(
"fmt"
"reflect"
)
func main() {
Value:=TestObject{}
TestFunction(Value)
}
//Generic function
func TestFunction(Value interface{}){
// Does value contain BaseObject? reflect.TypeOf(Value).Containes...Implements??
//Convert to BaseObject? BO:=Value.(BaseObject)
// If it does, call BO.ToString()
//fmt.println(BO.ToString())
}
//Base Object
type BaseObject struct {
}
func (this *HCObject) ToString() string {
return "[BaseObject]"
}
//Test Object
type TestObject struct{
BaseObject
}
func (this *TestObject) ToString() string {
return "[TestObject]"
}
首先,有两点:
ToString
应该是String
。参见fmt.Stringer
界面。话虽如此,这是一个可运行的代码示例,它可以满足您许多需要。
func TestFunction(v interface{}) {
fmt.Println(reflect.ValueOf(v).FieldByName("BaseObject").MethodByName("String").Call(nil)[0].String())
}
这段代码使用了reflect
包(只有在确实需要时才应该这样做)。我建议您使用该示例并深入研究reflect
一下,继续使用Go进行开发是否值得。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句