当前位置 博文首页 > golang 生成定单号的操作

    golang 生成定单号的操作

    作者:风.foxwho 时间:2021-02-04 15:17

    年(2位)+一年中的第几天(3位)+指定位数随机数

    //生成单号
    //06123xxxxx
    //sum 最少10位,sum 表示全部单号位数
    func MakeYearDaysRand(sum int) string {
      //年
      strs := time.Now().Format("06")
      //一年中的第几天
      days := strconv.Itoa(GetDaysInYearByThisYear())
      count := len(days)
      if count < 3 {
        //重复字符0
        days = strings.Repeat("0", 3-count) + days
      }
      //组合
      strs += days
      //剩余随机数
      sum = sum - 5
      if sum < 1 {
        sum = 5
      }
      //0~9999999的随机数
      ran := GetRand()
      pow := math.Pow(10, float64(sum)) - 1
      //fmt.Println("sum=>", sum)
      //fmt.Println("pow=>", pow)
      result := strconv.Itoa(ran.Intn(int(pow)))
      count = len(result)
      //fmt.Println("result=>", result)
      if count < sum {
        //重复字符0
        result = strings.Repeat("0", sum-count) + result
      }
      //组合
      strs += result
      return strs
    }
    //年中的第几天
    func GetDaysInYearByThisYear() int {
      now := time.Now()
      total := 0
      arr := []int{31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}
      y, month, d := now.Date()
      m := int(month)
      for i := 0; i < m-1; i++ {
        total = total + arr[i]
      }
      if (y%400 == 0 || (y%4 == 0 && y%100 != 0)) && m > 2 {
        total = total + d + 1
      } else {
        total = total + d
      }
      return total;
    }
    

    补充:基于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
    }
      

    以上为个人经验,希望能给大家一个参考,也希望大家多多支持站长博客。如有错误或未考虑完全的地方,望不吝赐教。

    js
    下一篇:没有了