• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    golang 生成定单号的操作

    年(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
    }
      

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

    您可能感兴趣的文章:
    • Golang 实现Thrift客户端连接池方式
    • golang 通过ssh代理连接mysql的操作
    • 浅谈golang结构体偷懒初始化
    • golang连接kafka消费进ES操作
    • golang实现各种情况的get请求操作
    • Golang 实现分片读取http超大文件流和并发控制
    • 在Golang中使用http.FileServer返回静态文件的操作
    上一篇:goland设置控制台折叠效果
    下一篇:xorm根据数据库生成go model文件的操作
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    golang 生成定单号的操作 golang,生成,定单,号的,操作,