基于GO语言实现的支持高并发订单号生成函数

 1.固定24位长度订单号,毫秒+进程id+序号。

 2.同一毫秒内只要不超过一万次并发,则订单号不会重复。

github地址:https://github.com/w3liu/go-common/blob/master/number/ordernum/ordernum.go

package ordernum

import (
   "fmt"
   "github.com/w3liu/go-common/constant/timeformat"
   "os"
   "sync/atomic"
   "time"
)

var num int64

//生成24位订单号
//前面17位代表时间精确到毫秒,中间3位代表进程id,最后4位代表序号
func Generate(t time.Time) string {
   s := t.Format(timeformat.Continuity)
   m := t.UnixNano()/1e6 - t.UnixNano()/1e9*1e3
   ms := sup(m, 3)
   p := os.Getpid() % 1000
   ps := sup(int64(p), 3)
   i := atomic.AddInt64(&num, 1)
   r := i % 10000
   rs := sup(r, 4)
   n := fmt.Sprintf("%s%s%s%s", s, ms, ps, rs)
   return n
}

//对长度不足n的数字前面补0
func sup(i int64, n int) string {
   m := fmt.Sprintf("%d", i)
   for len(m) < n {
      m = fmt.Sprintf("0%s", m)
   }
   return m
}