【发布时间】:2014-09-02 14:23:13
【问题描述】:
我正在尝试在 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]"
}
【问题讨论】:
-
有关
interface{}的更多信息,另请参阅stackoverflow.com/a/23148998/6309 -
如果您尝试在 Go 中执行“经典”OOP,您会感到失望。你确定找不到类似 Go 的解决方案吗?
-
您最好不要尝试在 Go 中编写类风格的面向对象代码。 Go 没有类、子类、继承等等。
-
这些是不是子类,因为没有继承。请阅读embedding 和method sets。嵌入基本上是自动委托。
-
类型嵌入在结构中,而不是在接口中。你看,这一切都变得多毛和丑陋。基于类的继承和结构嵌入之间确实存在巨大的阻抗不匹配。结构嵌入是一些很好的语法糖,可以减少输入几个字符。就是这样。