golang 生成定单号的操作

 更新时间:2020年12月18日 15:31:14   作者:风.foxwho  
这篇文章主要介绍了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
}
  

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

相关文章

  • Go语言的io输入输出流方式

    Go语言的io输入输出流方式

    Go语言中,输入输出流的处理通过io库中的Reader和Writer接口来实现,Reader接口定义了Read方法,用于从流中读取数据到程序中,Writer接口定义了Write方法,用于将数据写入到底层的数据流中,这些接口被许多标准库的类型所实现
    2024-10-10
  • 一文详解Golang使用接口支持Apply方法的配置模式

    一文详解Golang使用接口支持Apply方法的配置模式

    这篇文章主要为大家介绍了一文详解Golang使用接口支持Apply方法的配置模式,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2024-01-01
  • go语言中sort包的实现方法与应用详解

    go语言中sort包的实现方法与应用详解

    golang中也实现了排序算法的包sort包,所以下面这篇文章主要给大家介绍了关于go语言中sort包的实现方法与应用的相关资料,文中通过示例代码介绍的非常详细,需要的朋友们可以参考借鉴,下面随着小编来一起学习学习吧。
    2017-11-11
  • 使用docker构建golang线上部署环境的步骤详解

    使用docker构建golang线上部署环境的步骤详解

    这篇文章主要介绍了使用docker构建golang线上部署环境的步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
    2017-11-11
  • go使用makefile脚本编译应用的方法小结

    go使用makefile脚本编译应用的方法小结

    makefile可以看作是make工具的脚本文件, 而make主要用来处理一系列命令。常用的比如用来编译和打包文件, 在C/C++的编译打包中应用最广泛了,这篇文章主要介绍了go使用makefile脚本编译应用,需要的朋友可以参考下
    2022-08-08
  • 使用go语言解析xml的实现方法(必看篇)

    使用go语言解析xml的实现方法(必看篇)

    下面小编就为大家带来一篇使用go语言解析xml的实现方法(必看篇)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-06-06
  • Go实现用户每日限额的方法(例一天只能领三次福利)

    Go实现用户每日限额的方法(例一天只能领三次福利)

    这篇文章主要介绍了Go实现用户每日限额的方法(例一天只能领三次福利)
    2022-01-01
  • 一步步教你编写可测试的Go语言代码

    一步步教你编写可测试的Go语言代码

    相信每位编程开发者们应该都知道,Golang作为一门标榜工程化的语言,提供了非常简便、实用的编写单元测试的能力。本文通过Golang源码包中的用法,来学习在实际项目中如何编写可测试的Go代码。有需要的朋友们可以参考借鉴,下面跟着小编一起去学习学习吧。
    2016-11-11
  • golang 常用定时任务汇总

    golang 常用定时任务汇总

    这篇文章主要介绍了golang 常用定时任务汇总,golang利用goroutine外加github.com/gorhill/cronexpr库就可实现定时任务,具体代码介绍,需要的小伙伴可以参考一下
    2022-09-09
  • Go 每日一库之termtables的使用

    Go 每日一库之termtables的使用

    本文主要介绍了Go 每日一库之termtables的使用,termtables处理表格形式数据的输出。是一个很小巧的工具库。具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-07-07

最新评论