由类型文字定义的类型的struct字段的方法

BeM*_*her 5 struct types nested anonymous go

在解码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)
}
Run Code Online (Sandbox Code Playgroud)

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

type Data struct {
    Records []struct {
        ID int
        Value string
    }
}
Run Code Online (Sandbox Code Playgroud)

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

zzz*_*zzz 6

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

 方法是具有接收器的功能.方法声明将标识符(方法名称)绑定到方法.它还将方法与接收器的基本类型相关联.

MethodDecl   = "func" Receiver MethodName Signature [ Body ] .
Receiver     = "(" [ identifier ] [ "*" ] BaseTypeName ")" .
BaseTypeName = identifier .
Run Code Online (Sandbox Code Playgroud)

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

Records第二个OP示例中的字段类型是使用类型文字定义的,即.不符合上面的"类型名称"条件.