最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Go語言實現(xiàn)有規(guī)律的數(shù)字版本號的排序工具

 更新時間:2023年01月10日 08:28:14   作者:陳明勇  
這篇文章主要為大家詳細介紹了如何利用Go語言實現(xiàn)有規(guī)律的數(shù)字版本號的排序工具,文中的示例代碼講解詳細,感興趣的小伙伴可以了解一下

前言

在某些場景,我們可能需要對版本號進行排序。版本號的形式有很多種,例如:

  • 1.0.0, 1.0.1.1, 2.0.1.1
  • v1.0.0, v1.10.1, v2.0
  • ······

而本文所介紹的版本號排序工具,是針對有規(guī)律的數(shù)字版本號如 1.0.0, 1, 2.15.0 這種形式。

創(chuàng)作解讀

版本號的大小比較與排序

版本號排序的前提,首先得比較兩個版本號的大小。由于版本號長度可能不一致,所以需要額外做一些處理。對于版本號的比較,我的算法思路是:

1、以 . 為分隔符,將版本號的每段數(shù)字存到切片里,方便后續(xù)比較大小。例如 "1.0"["1", "0"],"1.0.1"["1", "0", "1"]。

firstVersions := strings.Split(versions[i], ".")
secondVersions := strings.Split(versions[j], ".")

2、由于兩個版本號的長度可能不一致,因此需要做 填充0,統(tǒng)一長度 的操作。所以第二步就是獲取兩個版本號中,最大長度,然后對長度最小的版本號切片,填充零,保持兩個版本號的長度一致。例如第一步的兩個版本號 ["1", "0"]、["1", "0", "1"],需要對第一個版本號填充一個零(填充之后的結(jié)果 → ["1", "0", "0"]),才能保持兩個版本號的長度一致,方便后續(xù)比較。

// 0 填充
// 獲取最大長度并向最小長度的切片填充 "0",統(tǒng)一長度
func getMaxAndFillZero(s1 *[]string, s2 *[]string) int {
    len1, len2 := len(*s1), len(*s2)
    if len1 > len2 {
        fillZero(s2, len1-len2)
        return len1
    }
    fillZero(s1, len2-len1)
    return len2
}

// 0 填充
func fillZero(s *[]string, size int) {
    for i := 0; i < size; i++ {
        *s = append(*s, "0")
    }
}

size 為最大長度 - 最小長度的值,也就是要填充 0 的個數(shù)。

3、遍歷切片,從前依次比較兩個版本號每段數(shù)字的大小。

如果第一個版本號的第一段數(shù)字大于或小于第二個版本號的第二段數(shù)字,則可以根據(jù)排序規(guī)則決定兩個版本號的先后位置。

如果相等,則比較下一段數(shù)字的大小,以此類推。

for k := 0; k < maxLen; k++ {
    // 由于上面判斷了版本號的合法性,因此 error 可以忽略
    vi, _ := strconv.Atoi(firstVersions[k])
    vj, _ := strconv.Atoi(secondVersions[k])
    if vi < vj {
        if sortRule == DESC {
            // 降序排序
            // todo 交換操作
        }
        // 默認升序排序,即使 sortRule 不是 ASC
        // todo 交換操作
    } else if vi > vj {
        // 降序排序
        if sortRule == DESC {
            // todo 交換操作
        }
        // 默認升序排序,即使 sortRule 不是 ASC
        // todo 交換操作
    }
}

對字符串切片的排序,本工具使用的函數(shù)是 SliceStable(x any, less func(i, j int) bool),通過此函數(shù),可以自定義比較大小的規(guī)則。

sort.SliceStable(versions, func(i, j int) bool {
    firstVersions := strings.Split(versions[i], ".")
    secondVersions := strings.Split(versions[j], ".")
    // 判斷版本號格式的合法性
    isNormal(firstVersions)
    isNormal(secondVersions)
    // 獲取最大值并填充 "0", 統(tǒng)一長度
    maxLen := getMaxAndFillZero(&firstVersions, &secondVersions)
    for k := 0; k < maxLen; k++ {
        // 由于上面判斷了版本號的合法性,因此 error 可以忽略
        vi, _ := strconv.Atoi(firstVersions[k])
        vj, _ := strconv.Atoi(secondVersions[k])
        if vi < vj {
            if sortRule == DESC {
                // 降序排序
                return false
            }
            // 默認升序排序,即使 sortRule 不是 ASC
            return true
        } else if vi > vj {
            // 降序排序
            if sortRule == DESC {
                return true
            }
            // 默認升序排序,即使 sortRule 不是 ASC
            return false
        }
    }
    return false
})

版本號的合法性校驗

由于本工具處理的版本號是有規(guī)律的數(shù)字版本號,如果版本號包含字母或其他特殊字符,會影響到排序的進行,因此需要提前對版本號進行合法性的校驗。

// 判斷版本號的格式是否合法
func isNormal(versions []string) {
   for _, v := range versions {
      for _, r := range []rune(v) {
         if !unicode.IsNumber(r) {
            panic(errors.New("版本號格式錯誤:" + string(r)))
         }
      }
   }
}

遍歷每段版本號,然后對每段版本號的字符進行遍歷,判斷是否是數(shù)字,如果不是,則 panic 掉,結(jié)束排序。

錯誤處理

由于版本號的不合法性,可能會程序運行的過程中產(chǎn)生錯誤。因此,有必要人工捕獲錯誤,提高工具的健壯性。

版本號排序函數(shù)提供一個 error 的返回值,用于判斷是否產(chǎn)生錯誤。錯誤的捕獲邏輯如下:

defer func() {
   if r := recover(); r != nil {
      if er, ok := r.(error); ok {
         err = er
      } else {
         err = errors.New("")
         fmt.Println("未知錯誤: ")
         fmt.Println(r)
      }
   }
}()

捕獲版本號的合法性校驗時主動 panic 的錯誤,并結(jié)束排序。

總結(jié)

  • 本工具實現(xiàn)了對有規(guī)律的數(shù)字版本號集合進行排序。
  • 在排序的過程中,由于版本號的長度可能不一致,因此執(zhí)行填充 0 操作,統(tǒng)一長度,再進行版本號的大小比較;
  • 除此之外,還對版本號的合法性做了校驗,捕獲可預知和不可預知的 panic 錯誤,提高了工具的健壯性。
  • 經(jīng)測試,核心功能已實現(xiàn),但有些地方還能改進,后續(xù)會對代碼進行優(yōu)化。

到此這篇關(guān)于Go語言實現(xiàn)有規(guī)律的數(shù)字版本號的排序工具的文章就介紹到這了,更多相關(guān)Go語言排序工具內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 在Golang中正確的修改HTTPRequest的Host的操作方法

    在Golang中正確的修改HTTPRequest的Host的操作方法

    我們工作中經(jīng)常需要通過HTTP請求Server的服務,比如腳本批量請求接口跑數(shù)據(jù),由于一些網(wǎng)關(guān)策略,部分Server會要求請求中Header里面附帶Host參數(shù),所以本文給大家介紹了如何在Golang中正確的修改HTTPRequest的Host,需要的朋友可以參考下
    2023-12-12
  • Go?select使用與底層原理講解

    Go?select使用與底層原理講解

    這篇文章主要介紹了Go?select使用與底層原理講解,select是Go提供的IO多路復用機制,可以用多個cas同時監(jiān)聽多個channl的讀寫狀態(tài),相關(guān)內(nèi)容需要的朋友可以參考一下
    2022-07-07
  • Go語言中的函數(shù)式編程實踐

    Go語言中的函數(shù)式編程實踐

    這篇文章主要介紹了Go語言中的函數(shù)式編程實踐,主要講解Go語言中的函數(shù)式編程概念和使用。小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-05-05
  • Go設(shè)計模式之模板方法模式講解和代碼示例

    Go設(shè)計模式之模板方法模式講解和代碼示例

    模版方法是一種行為設(shè)計模式, 它在基類中定義了一個算法的框架, 允許子類在不修改結(jié)構(gòu)的情況下重寫算法的特定步驟,本文將通過代碼示例給大家詳細的介紹一下Go模板方法模式,需要的朋友可以參考下
    2023-08-08
  • Golang 并發(fā)讀寫鎖的具體實現(xiàn)

    Golang 并發(fā)讀寫鎖的具體實現(xiàn)

    Go語言中的sync.RWMutex提供了讀寫鎖機制,允許多個協(xié)程并發(fā)讀取共享資源,但在寫操作時保持獨占性,本文主要介紹了Golang 并發(fā)讀寫鎖的具體實現(xiàn),感興趣的可以了解一下
    2025-02-02
  • go語言中int和byte轉(zhuǎn)換方式

    go語言中int和byte轉(zhuǎn)換方式

    這篇文章主要介紹了go語言中int和byte轉(zhuǎn)換方式,需要的朋友可以參考下
    2018-11-11
  • Go語言自定義linter靜態(tài)檢查工具

    Go語言自定義linter靜態(tài)檢查工具

    這篇文章主要介紹了Go語言自定義linter靜態(tài)檢查工具,Go語言是一門編譯型語言,編譯器將高級語言翻譯成機器語言,會先對源代碼做詞法分析,詞法分析是將字符序列轉(zhuǎn)換為Token序列的過程,文章詳細介紹需要的小伙伴可以參考一下
    2022-05-05
  • Go生成base64圖片驗證碼實例(超詳細工具類)

    Go生成base64圖片驗證碼實例(超詳細工具類)

    這段時間需要使用圖片驗證碼庫,下面這篇文章主要給大家介紹了關(guān)于Go生成base64圖片驗證碼的相關(guān)資料,文中給出了詳細的實例代碼,需要的朋友可以參考下
    2023-06-06
  • golang中的jwt使用教程流程分析

    golang中的jwt使用教程流程分析

    這篇文章主要介紹了golang中的jwt使用教程,接下來我們需要講解一下Claims該結(jié)構(gòu)體存儲了token字符串的超時時間等信息以及在解析時的Token校驗工作,需要的朋友可以參考下
    2023-05-05
  • 一文了解Go語言io.Copy函數(shù)

    一文了解Go語言io.Copy函數(shù)

    這篇文章主要為大家介紹了Go語言io.Copy函數(shù)使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-07-07

最新評論

德兴市| 赣州市| 临安市| 河津市| 南川市| 开鲁县| 宜宾市| 凌源市| 济阳县| 清原| 福建省| 怀柔区| 浦县| 津南区| 扶余县| 湘乡市| 罗平县| 云南省| 类乌齐县| 霍林郭勒市| 望奎县| 龙里县| 云浮市| 神农架林区| 会理县| 沙河市| 巩留县| 玉溪市| 许昌市| 兰西县| 肃南| 那曲县| 随州市| 洞口县| 海盐县| 赞皇县| 高要市| 清流县| 镇坪县| 万载县| 陈巴尔虎旗|