package server import ( "fmt" "sync" "time" ) type OrderSnServer struct { machineID int lastTime int64 // 上次时间(毫秒) sequence int64 mu sync.Mutex } var ( orderSnServerInstance *OrderSnServer orderSnServerOnce sync.Once ) // GetOrderSnServerInstance 获取单例实例 func GetOrderSnServerInstance(machineID int) *OrderSnServer { orderSnServerOnce.Do(func() { orderSnServerInstance = &OrderSnServer{ machineID: machineID, lastTime: time.Now().UnixMilli(), sequence: 0, } }) return orderSnServerInstance } func (g *OrderSnServer) Generate() string { g.mu.Lock() defer g.mu.Unlock() currentTime := time.Now().UnixMilli() if currentTime == g.lastTime { g.sequence++ } else { g.sequence = 1 g.lastTime = currentTime } // 格式化时间,包含毫秒 t := time.UnixMilli(currentTime) // 格式:年月日时分秒 + 毫秒(3位) + 机器ID + 序列号 return fmt.Sprintf("%s%03d%02d%04d", t.Format("20060102150405"), // 14位 t.Nanosecond()/1e6, // 3位毫秒 g.machineID, // 2位 g.sequence, // 4位 ) } // GenerateString 生成字符串格式订单号 func (g *OrderSnServer) GenerateString(prefix string) string { // 调用无锁Generate获取ID id := g.Generate() // 格式化为字符串 return fmt.Sprintf("%s%s", prefix, id) }