- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我正在创建一个 API,我有两种不同的 JSON 响应结构;一种用于单个记录,一种用于收集记录:
type Model struct {
Id uint
}
type Collection struct {
Records []Model
}
Model
只是数据库数据(例如,用户)的结构表示,Collection
是模型的集合。
问题是会有单独的结构嵌入 Model
类型,如下所示:
type User struct {
*Model
Name string
}
因为 User
不满足 Model
类型,我不能像这样将它附加到 Collection
结构中:
user := User{&Model{1}, "Jon"}
uc := &Collection{[]User{user}}
如何让 Records 结构接受实现 Model
的结构类型?
最佳答案
你有两个选择:
如果您没有太多的 foos 和 bars,可以选择实现单独的集合,例如 UserCollection
、BarCollection
、FooCollection
。
另一种方法是使用通用的空接口(interface)类型 interface{}
,它将保存任何类型的值(因为每种类型的每个实例都满足空接口(interface)):
type Collection struct {
Records []interface{}
}
这有很多缺点,例如每次访问 Records
字段时都必须进行类型断言,您可能会错误地将所有内容放在那里,并且您必须使用反射进行大多数操作。
使用接口(interface)的更好方法是实现一个模型接口(interface),并让作为模型的每个类型都实现该接口(interface):
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
虚拟方法。这个虚拟方法只是用来区分接口(interface)和空接口(interface),这样你就不能将整数值或字符串代替实际模型放入集合中。
关于struct - 嵌入式类型和结构的多态性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32981576/
我来自 Asp.Net 世界,试图理解 Angular State 的含义。 什么是 Angular 状态?它类似于Asp.Net中的ascx组件吗?是子页面吗?它类似于工作流程状态吗? 我听到很多人
我一直在寻找 3 态拨动开关,但运气不佳。 基本上我需要一个具有以下状态的开关: |开 |不适用 |关 | slider 默认从中间开始,一旦用户向左或向右滑动,就无法回到N/A(未回答)状态。 有人
我是一名优秀的程序员,十分优秀!