在Go

时间:2016-05-11 08:07:40

标签: go types

我有两个文件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,也是如此。这两个文件都位于同一个包中。

我有什么遗失的吗?

3 个答案:

答案 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