类型字面量定义的类型的结构体字段上的方法

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接口实现一样。

1个回答

6
不,方法只能附加到在同一包中定义的命名类型。从规范中可以看到:
引用如下: “方法是带有接收器的函数。方法声明将标识符(方法名称)绑定到方法。它还将方法与接收器的基本类型相关联。”
MethodDecl   = "func" Receiver MethodName Signature [ Body ] .
Receiver     = "(" [ identifier ] [ "*" ] BaseTypeName ")" .
BaseTypeName = identifier .

接收者类型必须是T或*T形式,其中T是类型名称。 T所表示的类型称为接收者基本类型;它不得是指针或接口类型,并且必须在与方法相同的包中声明。该方法被称为绑定到基本类型,并且该方法名称仅在该类型的选择器中可见。 在第二个OP示例中,“Records”字段的类型是使用类型文本定义的,即不满足上述“类型名称”条件。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接