go - 在 GoLang 中访问嵌入式方法

标签 go embedding

我正在尝试在 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/

相关文章:

go - fmt.Println 是否接收任何类型的参数?

unit-testing - 如何在 Golang 中正确模拟具有成员函数的结构?

html - 在 HTML 的嵌入式 SVG 中嵌入 HTML?

python - 如何将 SWF 内容加载到 Linux 上的 Python 应用程序中?

json - 将任意字段添加到未知结构的 json 输出

go - 为什么我的追加函数会将 slice 的每个成员更改为要添加的新项目?

unit-testing - 我应该使用一个接口(interface)来允许模拟吗?

go - 为什么这两个错误不相等

tensorflow keras嵌入LSTM

machine-learning - 训练后如何用时间分布密集替换嵌入层?