我正在尝试在 go 中创建一些通用函数来处理许多不同的对象类型,其中一些类型嵌入了一个方便的子类型,我创建了调用 BaseObject。
我似乎无法弄清楚如何测试“Value interface{}”是否包含 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]"
}
最佳答案
首先,有几点:
- 最好在 play.golang.org 上提供工作代码示例的链接。
- 始终 fmt 您的代码。
ToString
应该是String
。参见fmt.Stringer
接口(interface)。- 正如其他人指出的那样,尝试在 Go 中编写 Java 或 C++ 将以痛苦告终。
话虽如此,this是一个可运行的代码示例,它可以用很多 but 执行您想要的操作。
func TestFunction(v interface{}) {
fmt.Println(reflect.ValueOf(v).FieldByName("BaseObject").MethodByName("String").Call(nil)[0].String())
}
此代码使用 reflect
包(这是只有当您确实需要时才应该做的事情)。我建议您尝试一下该示例并深入研究 reflect
以了解继续使用 Go 的方式是否值得。
关于go - 在 GoLang 中访问嵌入式方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25625757/