我正在创建一个 API,并且有两种不同的 JSON 响应结构;一种用于单个记录,一种用于记录集合:
type Model struct {
Id uint
}
type Collection struct {
Records []Model
}
A Model
只是数据库数据的结构表示(例如,用户),以及Collection
是模型的集合。
问题是会有单独的结构嵌入Model
类型,像这样:
type User struct {
*Model
Name string
}
并且自从一个User
不满足Model
类型,我无法将其附加到Collection
像这样的结构:
user := User{&Model{1}, "Jon"}
uc := &Collection{[]User{user}}
如何使 Records 结构接受实现的结构类型Model
?
您有两个选择:
实现单独的集合,例如UserCollection
, BarCollection
, FooCollection
如果您没有太多的 foos 和 bar,这是一个选择。
另一种方法是使用通用空接口类型interface{}
它将保存任何类型的值(因为每种类型的每个实例都满足空接口):
type Collection struct {
Records []interface{}
}
这有很多缺点,例如每次访问时都必须执行类型断言Records
字段,您可能会错误地将所有内容放在那里,并且您必须使用反射来进行大多数操作。
使用接口的更好方法是实现一个模型接口,并让每个模型类型都实现该接口:
type Model interface {
ImplementsModel()
}
type BaseModel struct {
Id uint
}
func (b *BaseModel) ImplementsModel() {}
type User struct {
*BaseModel
Name string
}
type Collection struct {
Records []Model
}
当然你可以删除ImplementsModel
一旦你有了有意义的方法,就可以使用虚拟方法。这个虚拟方法只是为了区分接口和空接口,这样您就不能将整数值或字符串代替实际模型放入集合中。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)