如何创建自动递增ID字段

问题描述

我在JSON文件中定义了一组员工:

type PrimitiveEmployee struct {
    PrimitiveID     string   `xml:"ID,attr"`
    ContractID      []string `xml:"ContractID"`
}

IDContractID都是字母,但是不一定要给它们连续的字母序列。例如,可能有一个雇员为 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标记。

https://play.golang.org/p/0iTaQSzTPZ_j