问题描述
我在JSON文件中定义了一组员工:
type PrimitiveEmployee struct {
PrimitiveID string `xml:"ID,attr"`
ContractID []string `xml:"ContractID"`
}
ID
和ContractID
都是字母,但是不一定要给它们连续的字母序列。例如,可能有一个雇员为 PrimitiveID = A ,另一个雇员为 PrimitiveID = C ,但没有雇员为 PrimitiveID = B 。 / p>
我想将此数据转换为:
type Employee struct {
ID int
PrimitiveID string
Contracts []Contract
}
问题是,我希望employee-ID从0开始,并在每次初始化结构时以1递增。有点像数据库中的自动增量ID或枚举中的iota。
然后将自动使用 ID = 0 创建具有 PrimitiveID = A 的员工,而具有 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
标记。