| @@ -5,6 +5,10 @@ | |||
| 1.go 1.16 | |||
| 2. 启用Go-Modules | |||
| ``` | |||
| go env -w GO111MODULE=on | |||
| go env -w GOPROXY=https://goproxy.cn,https://goproxy.io,direct | |||
| ``` | |||
| ## Go代码示例 | |||
| @@ -34,46 +34,46 @@ type SnowWorkerM1 struct { | |||
| } | |||
| func NewSnowWorkerM1(options *contract.IdGeneratorOptions) contract.ISnowWorker { | |||
| var WorkerIdBitLength byte | |||
| var SeqBitLength byte | |||
| var MaxSeqNumber uint32 | |||
| var workerIdBitLength byte | |||
| var seqBitLength byte | |||
| var maxSeqNumber uint32 | |||
| var WorkerId = options.WorkerId | |||
| var workerId = options.WorkerId | |||
| if options.WorkerIdBitLength == 0 { | |||
| WorkerIdBitLength = 6 | |||
| workerIdBitLength = 6 | |||
| } else { | |||
| WorkerIdBitLength = options.WorkerIdBitLength | |||
| workerIdBitLength = options.WorkerIdBitLength | |||
| } | |||
| if options.SeqBitLength == 0 { | |||
| SeqBitLength = 6 | |||
| seqBitLength = 6 | |||
| } else { | |||
| SeqBitLength = options.SeqBitLength | |||
| seqBitLength = options.SeqBitLength | |||
| } | |||
| if options.MaxSeqNumber > 0 { | |||
| MaxSeqNumber = options.MaxSeqNumber | |||
| maxSeqNumber = options.MaxSeqNumber | |||
| } else { | |||
| MaxSeqNumber = uint32(math.Pow(2, float64(options.SeqBitLength))) - 1 | |||
| maxSeqNumber = uint32(math.Pow(2, float64(options.SeqBitLength))) - 1 | |||
| } | |||
| var MinSeqNumber = options.MinSeqNumber | |||
| var TopOverCostCount = options.TopOverCostCount | |||
| var minSeqNumber = options.MinSeqNumber | |||
| var topOverCostCount = options.TopOverCostCount | |||
| var BaseTime int64 | |||
| var baseTime int64 | |||
| if options.BaseTime != 0 { | |||
| BaseTime = options.BaseTime | |||
| baseTime = options.BaseTime | |||
| } else { | |||
| BaseTime = 1582136402000 | |||
| baseTime = 1582136402000 | |||
| } | |||
| timestampShift := (byte)(options.WorkerIdBitLength + options.SeqBitLength) | |||
| currentSeqNumber := options.MinSeqNumber | |||
| return &SnowWorkerM1{ | |||
| BaseTime: BaseTime, | |||
| WorkerId: WorkerId, | |||
| WorkerIdBitLength: WorkerIdBitLength, | |||
| SeqBitLength: SeqBitLength, | |||
| MaxSeqNumber: MaxSeqNumber, | |||
| MinSeqNumber: MinSeqNumber, | |||
| TopOverCostCount: TopOverCostCount, | |||
| BaseTime: baseTime, | |||
| WorkerId: workerId, | |||
| WorkerIdBitLength: workerIdBitLength, | |||
| SeqBitLength: seqBitLength, | |||
| MaxSeqNumber: maxSeqNumber, | |||
| MinSeqNumber: minSeqNumber, | |||
| TopOverCostCount: topOverCostCount, | |||
| _TimestampShift: timestampShift, | |||
| _CurrentSeqNumber: currentSeqNumber} | |||
| } | |||
| @@ -19,54 +19,54 @@ type DefaultIdGenerator struct { | |||
| IdGeneratorException contract.IdGeneratorException | |||
| } | |||
| func NewDefaultIdGenerator(Options *contract.IdGeneratorOptions) *DefaultIdGenerator { | |||
| if Options == nil { | |||
| func NewDefaultIdGenerator(options *contract.IdGeneratorOptions) *DefaultIdGenerator { | |||
| if options == nil { | |||
| panic("dig.Options error.") | |||
| } | |||
| var minTime = time.Now().AddDate(-50, 0, 0).UnixNano() / 1e6 | |||
| if minTime == 0 || Options.BaseTime < minTime || Options.BaseTime > time.Now().UnixNano()/1e6 { | |||
| if minTime == 0 || options.BaseTime < minTime || options.BaseTime > time.Now().UnixNano()/1e6 { | |||
| panic("BaseTime error.") | |||
| } | |||
| if Options.SeqBitLength+Options.WorkerIdBitLength > 22 { | |||
| if options.SeqBitLength+options.WorkerIdBitLength > 22 { | |||
| panic("error:WorkerIdBitLength + SeqBitLength <= 22") | |||
| } | |||
| maxWorkerIdNumber := uint16(math.Pow(float64(2), float64(Options.WorkerIdBitLength))) - 1 | |||
| if Options.WorkerId > maxWorkerIdNumber { | |||
| maxWorkerIdNumber := uint16(math.Pow(float64(2), float64(options.WorkerIdBitLength))) - 1 | |||
| if options.WorkerId > maxWorkerIdNumber { | |||
| panic("WorkerId error. (range:[1, "+ string(maxWorkerIdNumber)+ "]") | |||
| } | |||
| if Options.SeqBitLength < 2 || Options.SeqBitLength > 21 { | |||
| if options.SeqBitLength < 2 || options.SeqBitLength > 21 { | |||
| panic("SeqBitLength error. (range:[2, 21])") | |||
| } | |||
| maxSeqNumber := uint32(math.Pow(2, float64(Options.SeqBitLength))) - 1 | |||
| if Options.MaxSeqNumber > maxSeqNumber { | |||
| maxSeqNumber := uint32(math.Pow(2, float64(options.SeqBitLength))) - 1 | |||
| if options.MaxSeqNumber > maxSeqNumber { | |||
| panic("MaxSeqNumber error. (range:[1, "+ string(maxSeqNumber)+ "]") | |||
| } | |||
| if Options.MinSeqNumber > maxSeqNumber { | |||
| if options.MinSeqNumber > maxSeqNumber { | |||
| panic("MinSeqNumber error. (range:[1, "+ string(maxSeqNumber)+ "]") | |||
| } | |||
| var snowWorker contract.ISnowWorker | |||
| switch Options.Method { | |||
| switch options.Method { | |||
| case 1: | |||
| snowWorker = core.NewSnowWorkerM1(Options) | |||
| snowWorker = core.NewSnowWorkerM1(options) | |||
| case 2: | |||
| snowWorker = core.NewSnowWorkerM2(Options) | |||
| snowWorker = core.NewSnowWorkerM2(options) | |||
| default: | |||
| snowWorker = core.NewSnowWorkerM1(Options) | |||
| snowWorker = core.NewSnowWorkerM1(options) | |||
| } | |||
| if Options.Method == 1 { | |||
| if options.Method == 1 { | |||
| time.Sleep(time.Duration(500) * time.Microsecond) | |||
| } | |||
| return &DefaultIdGenerator{ | |||
| Options: Options, | |||
| Options: options, | |||
| SnowWorker: snowWorker, | |||
| } | |||
| } | |||