5

在解码 JSON 时,我总是为每个对象显式编写一个结构,以便我可以为父结构中的各个对象实现 Stringer 接口,如下所示:

type Data struct {
    Records []Record
}

type Record struct {
    ID int
    Value string
}

func (r Record) String() string {
    return fmt.Sprintf("{ID:%d Value:%s}", r.ID, r.Value)
}

我最近了解到可以使用匿名结构进行嵌套。这种方法对于定义要解码的数据的结构要简洁得多:

type Data struct {
    Records []struct {
        ID int
        Value string
    }
}

但是,是否可以在结构的成员上定义方法,特别是匿名结构的成员?就像第一个代码块中的 Stringer 接口实现一样。

4

1 回答 1

6

不,方法只能附加到同一包中定义的命名类型。从规格

 方法是带有接收器的函数。方法声明将标识符(方法名称)绑定到方法。它还将方法与接收者的基本类型相关联。

MethodDecl   = "func" Receiver MethodName Signature [ Body ] .
Receiver     = "(" [ identifier ] [ "*" ] BaseTypeName ")" .
BaseTypeName = identifier .

接收器类型必须是 T 或 *T 形式,其中 T 是类型名称。T 表示的类型称为接收者基类型;它不能是指针或接口类型,并且必须在与方法相同的包中声明。该方法被称为绑定到基本类型,并且方法名称仅在该类型的选择器中可见。

第二个 OP 示例中的Records字段类型是使用类型文字定义的,即。不满足上面的“类型名称”条件。

于 2013-01-01T13:40:07.587 回答