我有两个文件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
,也是如此。这两个文件都位于同一个包中。
我有什么遗失的吗?
答案 0 :(得分:4)
在Go中你通常会通过构图来完成这个:
type StatHandler struct {
Handler // Anonymous member of type Handler
}
// ...Later on
var stathandler StatHandler
stathandler.addField("some field", "some value")
答案 1 :(得分:1)
请注意,在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")
答案 2 :(得分:0)
声明的方法属于特定类型。 type
关键字会创建 new 类型,但不会继承"继承"您在类型规范中使用的类型的方法。
您声明的方法addField()
属于Handler
,类型StatHandler
没有任何方法,因为您还没有指定任何方法作为接收方类型。< / p>
如果您有StatHandler
类型的变量,并且想要调用addField()
方法,则需要输入*Handler
类型的值。您可以使用type conversion获得此类值,例如:
s := StatHandler{}
(*Handler)(&s).addField("somekey", "someval")
请注意,由于addField()
具有指针接收器,因此需要指针(因此使用&
地址运算符),但*StatHandler
只能转换为*Handler
}。
如果你首先有一个*StatHandler
指针:
sp := &StatHandler{}
(*Handler)(sp).addField("somekey", "someval")
由于新类型没有&#34;继承&#34;基础类型的方法,您应该考虑embedding来实现您想要的,因为嵌入类型的方法和字段提升到嵌入类型:
type StatHandler struct {
Handler // Embed Handler, so addField() method will be promoted
}
s2 := StatHandler2{}
s2.addField("somekey", "someval")
尝试Go Playground上的示例。
规范中涵盖了类型具体方法的确切定义:Method sets。