在 Go 中从派生类型调用方法

我有两个文件,generic_handler.go,基本上看起来像这样:


type Handler struct{

    fields map[string]interface{}

}


func (handler *Handler) addField(key string, value interface{}){ some code }

和 stat_handler.go:


type StatHandler Handler

当我尝试调用(从 stat_handler.go 文件中)这样的方法时,出现错误:


//inside some function

stathandler.addField("some field", "some value")

它与type StatHandler has no field or method addField. 即使我addField通过制作它来导出也是一样的AddField。这两个文件都位于同一个包中。


有什么我想念的吗?


慕尼黑的夜晚无繁华
浏览 201回答 3
3回答

饮歌长啸

在 Go 中,你通常会通过组合来做到这一点:type StatHandler struct {    Handler  // Anonymous member of type Handler}// ...Later onvar stathandler StatHandlerstathandler.addField("some field", "some value")

噜噜哒

请注意,在 Go 中,为了访问另一个包中的方法,您需要将其导出,这意味着您必须将方法的第一个字母大写。type Handler struct{    fields map[string]interface{}}func (handler *Handler) AddField(key string, value interface{}){ some code }然后,如果您的包被命名为stathandler您可以访问该AddField方法:stathandler.AddField("some field", "some value")

喵喔喔

声明的方法属于特定类型。该type关键字创建了一个新的类型,其确实您在类型规范使用的类型不是“继承”的方法。addField()您声明的方法属于Handler,该类型StatHandler没有任何方法,因为您没有指定任何方法作为接收者类型。如果你有一个类型的变量StatHandler并且你想调用addField()方法,你需要有一个类型的值*Handler。您可以通过使用类型转换来获得这样的值,例如:s := StatHandler{}(*Handler)(&s).addField("somekey", "someval")请注意,由于addField()有指针接收器,因此需要一个指针(因此使用&地址运算符),但*StatHandler只能转换为*Handler.如果您首先有一个*StatHandler指针:sp := &StatHandler{}(*Handler)(sp).addField("somekey", "someval")由于新类型不会“继承”底层类型的方法,因此您应该考虑嵌入来实现您想要的,因为嵌入类型的方法和字段被提升为嵌入器类型:type StatHandler struct {    Handler // Embed Handler, so addField() method will be promoted}s2 := StatHandler2{}s2.addField("somekey", "someval")试试Go Playground上的示例。规范中涵盖了类型具有哪些方法的确切定义:方法集。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go