【发布时间】:2017-10-28 02:40:51
【问题描述】:
我有几个结构,它们继承了一些基本结构。像这样的:
type s1 struct {
a string `json:"a"`
b string `json:"b"`
}
type s2 struct {
s1
c string `json:"c"`
d string `json:"d"`
}
type s3 struct {
s1
c string `json:"c"`
d string `json:"d"`
e string `json:"d"`
f string `json:"d"`
}
现在我需要定义一个函数,它可以在任何具有a、b 字段的结构上运行。像
func modifyStruct(s *s1) {
s.a, s.b = s.b, s.a
}
但必须在 s2、s3 和任何其他继承 s1 的结构上工作。我试图通过一个界面来实现这一点,但到目前为止还没有运气。有什么办法可以做到这一点?模板位于go-playground。
【问题讨论】:
-
为什么不附加一个带有
*s1接收器的方法,即func (s *s1) modify() { s.a, s.b = s.b, s.a; }?s2或s3变量将转发嵌入的s1字段的地址,并将其作为接收者传递给方法;也就是说,s2foo.modify()与(&s2foo.s1).modify()相同。 Playground link -
示例中的字段标签表明您计划将 encoding/json 包与这些类型一起使用。如果是这样,那么您应该export 字段名称。 json/encoding 包会忽略未导出的字段。