我有一个应用程序,它有多个同时运行的相同API实现(例如,一个由SQL数据库支持,另一个由存储在XML文件中的数据集支持)。我真正想做的是为API中每种类型的事物定义一个父类型,该类型:
包含所有实现共有的成员变量
定义所有实现都必须具备的方法。
因此,在(无效的)Go语言中,我想要做类似于以下的操作:
type Person interface {
Name string
Title string
Position string
Boss() *Person
}
type Person_XML struct {
Person
}
func (p *Person_XML) Boss() (*Person, error) {
// Poke around an XML document and answer the question
return boss, nil
}
type Person_SQL {
Person
}
func (p *Person_SQL) Boss() (*Person, error) {
// Do a DB query and construct the record for the boss
return boss, nil
}
当然,这种做法是不合法的,因为只有结构体有成员变量,而只有接口有成员函数。我可以尝试只用接口实现:
type Person interface {
Name() string
Title() string
Position() string
Boss() Person
}
type Person_XML struct {
NameValue string
TitleValue string
PositionValue string
Person
}
func (p *Person_XML) Name() string {
return p.NameValue
}
func (p *Person_XML) Title() string {
return p.TitleValue
}
func (p *Person_XML) Position() string {
return p.PositionValue
}
func (p *Person_XML) Boss() (Person, error) {
// Poke around an XML document and answer the question
return boss, nil
}
类似于其他实现方式。有没有另一种解决方案,不需要将成员变量转换为成员函数?在这种情况下,最佳实践是什么?
PersonSQL
和PersonXML
中使用*BasePerson
的术语,使得这个例子如此简洁。作为新的Go Golang用户,我不知道这个特性。非常好的帖子,正好回答了我的问题。 - Jeff Learman