这个问题最好用一个例子来描述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
- 1 回答
- 0 关注
- 133 浏览
添加回答
举报
0/150
提交
取消