如何创建自增 ID 字段
How to create an autoincrement ID field
我在 JSON 文件中定义了一组员工:
type PrimitiveEmployee struct {
PrimitiveID string `xml:"ID,attr"`
ContractID []string `xml:"ContractID"`
}
ID
和ContractID
都是字母,但不一定给定连续的字母序列。例如,可能存在 PrimitiveID=A 的员工和 PrimitiveID=C 的员工,但不存在 PrimitiveID 的员工=B.
我想将此数据转换成:
type Employee struct {
ID int
PrimitiveID string
Contracts []Contract
}
问题是,我希望 employee-ID 从 0 开始,每次初始化结构时递增 1。有点像数据库中的自动增量 ID 或枚举中的 iota。
PrimitiveID=A 的员工将自动创建 ID=0,而 的员工将自动创建PrimitiveID=C 会得到 ID=1.
我只是不知道如何在结构中解决这个问题。
非常感谢此处的任何帮助或指点。
创建自定义类型来管理唯一递增 ID:
type autoInc struct {
sync.Mutex // ensures autoInc is goroutine-safe
id int
}
func (a *autoInc) ID() (id int) {
a.Lock()
defer a.Unlock()
id = a.id
a.id++
return
}
因此您可以在目标位置或包级别使用它:
var ai autoInc // global instance
然后您可以创建“构造函数”函数来利用它:
func NewEmployee() *Employee {
return &Employee{
ID: ai.ID(),
}
}
然后可以将 JSON 数据编组到 Employee
,并且将保留 ID - 前提是 JSON 数据不包含 ID
标记。
我在 JSON 文件中定义了一组员工:
type PrimitiveEmployee struct {
PrimitiveID string `xml:"ID,attr"`
ContractID []string `xml:"ContractID"`
}
ID
和ContractID
都是字母,但不一定给定连续的字母序列。例如,可能存在 PrimitiveID=A 的员工和 PrimitiveID=C 的员工,但不存在 PrimitiveID 的员工=B.
我想将此数据转换成:
type Employee struct {
ID int
PrimitiveID string
Contracts []Contract
}
问题是,我希望 employee-ID 从 0 开始,每次初始化结构时递增 1。有点像数据库中的自动增量 ID 或枚举中的 iota。
PrimitiveID=A 的员工将自动创建 ID=0,而 的员工将自动创建PrimitiveID=C 会得到 ID=1.
我只是不知道如何在结构中解决这个问题。
非常感谢此处的任何帮助或指点。
创建自定义类型来管理唯一递增 ID:
type autoInc struct {
sync.Mutex // ensures autoInc is goroutine-safe
id int
}
func (a *autoInc) ID() (id int) {
a.Lock()
defer a.Unlock()
id = a.id
a.id++
return
}
因此您可以在目标位置或包级别使用它:
var ai autoInc // global instance
然后您可以创建“构造函数”函数来利用它:
func NewEmployee() *Employee {
return &Employee{
ID: ai.ID(),
}
}
然后可以将 JSON 数据编组到 Employee
,并且将保留 ID - 前提是 JSON 数据不包含 ID
标记。