中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

利用golang怎么實現一個定單號生成功能

發布時間:2020-12-19 13:52:36 來源:億速云 閱讀:458 作者:Leah 欄目:開發技術

利用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怎么實現一個定單號生成功能問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

永泰县| 徐闻县| 凤城市| 寿阳县| 海门市| 游戏| 天水市| 商都县| 中西区| 龙口市| 兰西县| 陵水| 永州市| 道真| 大安市| 兴宁市| 修文县| 肃北| 盐山县| 固镇县| 板桥市| 皮山县| 巩留县| 华池县| 若尔盖县| 金川县| 马尔康县| 高雄县| 崇州市| 嘉祥县| 新巴尔虎左旗| 济宁市| 大宁县| 恭城| 新乡市| 教育| 郁南县| 阿瓦提县| 浙江省| 得荣县| 西和县|