如何创建自增 ID 字段

How to create an autoincrement ID field

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

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

IDContractID都是字母,但不一定给定连续的字母序列。例如,可能存在 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 标记。

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