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

这个问题最好用一个例子来描述


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 main


import "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,


    }

}


守着星空守着你
浏览 134回答 1
1回答

MYYA

我认为在平面结构中不可能做到这一点,因为它需要在运行时更改结构类型的内存结构,这是不允许的。虽然您可以使用 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
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go