访问GoLang中的嵌入式方法

戈登·特鲁斯洛夫(Gordon Truslove):

我正在尝试创建一些通用函数来处理许多不同的对象类型,其中一些类型嵌入了我创建的方便的子类型,称为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]"
}
Ainar-G:

首先,有两点:

  • 在play.golang.org上提供指向工作代码示例的链接是一个好习惯。
  • 始终保留您的代码。
  • ToString应该是String参见fmt.Stringer界面。
  • 正如其他人指出的那样,尝试用Go编写C ++ Java将以痛苦的结尾告终。

话虽如此,是一个可运行的代码示例,它可以满足您许多需要。

func TestFunction(v interface{}) {
    fmt.Println(reflect.ValueOf(v).FieldByName("BaseObject").MethodByName("String").Call(nil)[0].String())
}

这段代码使用了reflect包(只有在确实需要时才应该这样做)。我建议您使用该示例并深入研究reflect一下,继续使用Go进行开发是否值得。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章