佳木斯湛栽影视文化发展公司

主頁 > 知識(shí)庫 > 解決Golang map range遍歷結(jié)果不穩(wěn)定問題

解決Golang map range遍歷結(jié)果不穩(wěn)定問題

熱門標(biāo)簽:呼叫中心市場需求 Linux服務(wù)器 地方門戶網(wǎng)站 百度競價(jià)排名 服務(wù)外包 網(wǎng)站排名優(yōu)化 鐵路電話系統(tǒng) AI電銷

閑言少敘,本文主要是想介紹一個(gè)Golang開發(fā)常見的一個(gè)問題。然而,此問題對于初學(xué)者來說卻經(jīng)常容易陷入坑中。

問題

我在寫一段代碼時(shí),使用了Golang的map數(shù)據(jù)結(jié)構(gòu),目的是想用map緩存計(jì)數(shù)結(jié)果。簡單來說map的鍵也是整型的,且以遞增順序存儲(chǔ)。我的最初想法是,在統(tǒng)計(jì)結(jié)束后,按照map中存儲(chǔ)的鍵有序輸出值??墒?,當(dāng)我運(yùn)行程序時(shí),結(jié)果并不是我想要的,而且有一定概率運(yùn)行結(jié)果不同。

問題代碼

func sortByBits(arr []int) []int {
  var bitmap = make(map[int][]int, 0)
  // map緩存
  for i := 0; i  len(arr); i++ {
    bits := calBits(arr[i])
    if _, ok := bitmap[bits]; !ok {
      tmp := make([]int, 0)
      tmp = append(tmp, arr[i])
      bitmap[bits] = tmp
    } else {
      bitmap[bits] = append(bitmap[bits], arr[i])
      for j := len(bitmap[bits]) - 1;j > 0; j-- {
        if bitmap[bits][j]  bitmap[bits][j - 1] {
          bitmap[bits][j], bitmap[bits][j - 1] = bitmap[bits][j - 1], bitmap[bits][j]
        }
      }
    }
  }
  // 輸出
  var res []int
  for _, value := range bitmap {
    res = append(res, value...)
  }
  return res
}
func calBits(n int) int {
  sum := 0
  for n > 0 {
    if n  1 == 1 {
      sum++
    }
    n = n >> 1
  }
  return sum
}

當(dāng)發(fā)現(xiàn)這個(gè)問題后,我使用二維數(shù)組替換map,改造代碼如下:

改造代碼

func sortByBits(arr []int) []int {
  var bitmap = make([][]int, 0, 10000)
  // map緩存
  for i := 0; i  len(arr); i++ {
    bits := calBits(arr[i])
    if len(bitmap) = bits {
      length := bits - len(bitmap) + 1
      for j := 0; j  length; j++ {
        tmp := make([]int, 0)
        bitmap = append(bitmap, tmp)
      }
    }
      
    if len(bitmap[bits]) == 0 {
      bitmap[bits] = append(bitmap[bits], arr[i])
    } else {
      bitmap[bits] = append(bitmap[bits], arr[i])
      for j := len(bitmap[bits]) - 1;j > 0; j-- {
        if bitmap[bits][j]  bitmap[bits][j - 1] {
          bitmap[bits][j], bitmap[bits][j - 1] = bitmap[bits][j - 1], bitmap[bits][j]
        }
      }
    }
  }
  // 輸出
  var res []int
  for _, value := range bitmap {
    res = append(res, value...)
  }
  return res
}
func calBits(n int) int {
  sum := 0
  for n > 0 {
    if n  1 == 1 {
      sum++
    }
    n = n >> 1
  }
  return sum
}

代碼很簡單,問題也很簡單。原理就是Golang的map按鍵輸出結(jié)果是隨機(jī)的,這是語言本身的一個(gè)特性,或者說是"坑"。作為開發(fā)者,要熟練掌握語言最基本特性,才能開發(fā)出最穩(wěn)健的程序。

補(bǔ)充:golang if _,ok:=range map; ok判斷key是否在map中

由于golang沒有提供item是否在array當(dāng)中的判斷方法,如果程序里面頻繁用到了這種判斷,可以將array轉(zhuǎn)化為以array當(dāng)中的成員為key的map再用上面的方法進(jìn)行判斷,這樣會(huì)提高判斷的效率。

判斷方法示例代碼

if _, ok := map[key]; ok {
//存在
}

如果每次都for循環(huán),會(huì)影響性能!

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。

您可能感興趣的文章:
  • Golang 空map和未初始化map的注意事項(xiàng)說明
  • golang 實(shí)現(xiàn)對Map進(jìn)行鍵值自定義排序
  • golang 如何獲取map所有key的方式
  • golang判斷key是否在map中的代碼
  • 快速解決Golang Map 并發(fā)讀寫安全的問題
  • golang 實(shí)現(xiàn)struct、json、map互相轉(zhuǎn)化
  • Golang自定義結(jié)構(gòu)體轉(zhuǎn)map的操作
  • Golang 使用Map實(shí)現(xiàn)去重與set的功能操作

標(biāo)簽:黃山 湘潭 崇左 仙桃 衡水 銅川 湖南 蘭州

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《解決Golang map range遍歷結(jié)果不穩(wěn)定問題》,本文關(guān)鍵詞  ;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 收縮
    • 微信客服
    • 微信二維碼
    • 電話咨詢

    • 400-1100-266
    阿拉善左旗| 思南县| 旬阳县| 从化市| 内黄县| 平湖市| 武夷山市| 辉县市| 长兴县| 萨嘎县| 鄂州市| 九江市| 沁源县| 永川市| 彭泽县| 隆子县| 呼伦贝尔市| 右玉县| 旌德县| 利津县| 纳雍县| 富宁县| 湘潭市| 阳新县| 城固县| 肃宁县| 鄂托克旗| 开化县| 临城县| 高尔夫| 会理县| 亳州市| 巩留县| 古丈县| 土默特左旗| 江城| 石泉县| 图片| 巨鹿县| 五大连池市| 麦盖提县|