Go 如何创建自动增量ID字段

Go 如何创建自动增量ID字段,go,struct,auto-increment,Go,Struct,Auto Increment,我在JSON文件中定义了一组员工: 类型基本员工结构{ PrimitiveID字符串`xml:“ID,attr”` constractd[]字符串`xml:“constractd”` } ID和contracted都是字母,但它们不一定是连续的字母序列。例如,可能存在一个PrimitiveID=A的员工和另一个PrimitiveID=C的员工,但不存在PrimitiveID=B的员工 我想将此数据转换为: type Employee结构{ ID int 原始ID字符串 合同[]合同 } 问题

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

类型基本员工结构{
PrimitiveID字符串`xml:“ID,attr”`
constractd[]字符串`xml:“constractd”`
}
ID
contracted
都是字母,但它们不一定是连续的字母序列。例如,可能存在一个PrimitiveID=A的员工和另一个PrimitiveID=C的员工,但不存在PrimitiveID=B的员工

我想将此数据转换为:

type Employee结构{
ID int
原始ID字符串
合同[]合同
}
问题是,我希望员工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
标记


有一个包含计数器的全局变量,在构造
员工的实例的函数中,读取该变量,然后将其递增。据推测,
sync/atomic.AddInt*
函数将更好地为您服务(否则,您的代码不能被并发运行goroutine使用)。要回答可能未被问到的问题,不,您不能以某种方式“自动”拥有您想要工作的内容,因为Go没有“构造函数”。如果您在内存中对一组Employee结构进行排序,您可以将它们放在一个数组中,并使用它们的偏移量作为ID。这保证了它们是唯一的,并且当您附加到数组时,它们在概念上会自动递增。UUID将是另一种选择。使用uuid的一个好处是,uuid不是连续的,因此可以很容易地猜测员工编号。