这个问题最好用一个例子来描述
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,
}
}
MYYA
相关分类