为了账号安全,请及时绑定邮箱和手机立即绑定

如何通过嵌入式接口嵌入结构值:可组合结构

如何通过嵌入式接口嵌入结构值:可组合结构

Go
守着星空守着你 2021-12-20 16:41:52
这个问题最好用一个例子来描述http://play.golang.org/p/bQuRr0kV-b我正在尝试制作一个可组合的结构。在这个例子中,我想要一个 Person 类型,其中包含来自女性或男性的嵌入值。如果我只是处理结构,我会像这样嵌入它们type Person Struct{  Female  Male}然而,我不能这样做,因为在实际项目中,有很多嵌入式结构,我更愿意保持结构干净和可组合。但也存在命名冲突——在这个例子中,男性和女性都包含字段“眼睛”。将冲突的值移动到 Person 结构不是一个可行的解决方案(因为许多其他嵌入的结构不包含该特定值)。我希望通过一个简单的接口传递这些值。示例如下:运行此代码时,我得到&{Name: Age:0 Type:male GenderType:0x10434120}GenderType 是指向男性结构体的指针(在本例中)。我的目标是返回一个平面结构,看起来像&{Name: Age:0 Type:male Eyes: ChestSize:0}package mainimport "fmt"type Person struct {    Name string    Age  int    Type string    GenderType }type GenderType interface {    TypeName() string}type Male struct {    Eyes     string    ChestSize int}type Female struct {    Eyes string    BustSize int}func (m *Male) TypeName() string {    return "male"}func (f *Female) TypeName() string {    return "female"}func main() {    d := NewHuman(new(Male))    fmt.Printf("%+v", d)}func NewHuman(gt GenderType) *Person {    return &Person{        Type: gt.TypeName(),        GenderType: gt,    }}
查看完整描述

1 回答

?
MYYA

TA贡献1868条经验 获得超4个赞

我认为在平面结构中不可能做到这一点,因为它需要在运行时更改结构类型的内存结构,这是不允许的。虽然您可以使用 GenderType 访问嵌入字段,但它仍然是允许的,因为您说这将是对满足接口的嵌入结构的引用,而不是更改结构本身的结构。

我认为使用它编组到平面 json 的更好方法是保留您的嵌入式结构,然后使 Person 结构成为 Marshaler

您可以添加自己的自定义 MarshalJSON() (byte[],error) 方法并使用它来制作平面 json 输出。

如果您需要专门的解组,那么您可以使用绑定到 Person 的 (UnmarshalJSON([]byte) error) 方法进行同样的操作。

请参阅https://golang.org/pkg/encoding/json/#Marshaler以获取进一步参考

这是一个显示我的意思的游乐场:https : //play.golang.org/p/qOl9WSaI3O


查看完整回答
反对 回复 2021-12-20
  • 1 回答
  • 0 关注
  • 133 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号