亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Golang中Map按照Value大小排序的方法實例

 更新時間:2022年03月09日 14:21:31   作者:IT范兒  
這篇文章主要給大家介紹了關于Golang中Map按照Value大小排序的相關資料,文中通過實例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下

Golang中的 map 默認是 無序的 。

起因

最近項目中有這樣一個需求:

根據(jù)用戶當前的坐標點,獲取該用戶附近的預設城市名稱。

這里有一個注意點是,假設這些支持的城市名稱是預設的,所以就不能直接通過地圖類api根據(jù)坐標點獲取所在城市名稱了。

想到的解決思路是:

  1. 獲取這幾個預設城市的坐標點
  2. App端獲取用戶當前坐標點
  3. 分別計算得到該用戶坐標點距離各個預設城市的坐標點距離
  4. 然后計算得到其中距離最小的一項
  5. 這個坐標點對應的城市就是所求

探索

經(jīng)過前期計算,在上面的第 3 步操作后我得到了下面的結果:

result := map[string]float64{  
   "城市A": 2334.20,  
 "城市B": 1992.33,  
 "城市C": 500.26,  
 "城市D": 10.39,  
 "城市E": 333.33,  
}

我們知道,Golang中 Map 是 無序的 。所以當我們使用 for-range 循環(huán)時:

for k, v := range result {  
   fmt.Printf("key: %v value: %v \n", k, v)  
}

結果可能是:

// 第一種可能結果:
key: 城市B value: 1992.33 
key: 城市C value: 500.26 
key: 城市D value: 10.39 
key: 城市E value: 333.33 
key: 城市A value: 2334.2 

// 第二種可能結果:
key: 城市E value: 333.33 
key: 城市A value: 2334.2 
key: 城市B value: 1992.33 
key: 城市C value: 500.26 
key: 城市D value: 10.39 

// 第三種可能結果:
key: 城市E value: 333.33 
key: 城市A value: 2334.2 
key: 城市B value: 1992.33 
key: 城市C value: 500.26 
key: 城市D value: 10.39

所以,我們不能按照 key 或者 value 來進行排序。

實現(xiàn)

但Golang中切片 Slice 是 有序的。 我們可以結果使用 Slice 來實現(xiàn)對 Map 的排序。

第一步

我們先將上面的 map 轉(zhuǎn)換成一個 slice :

type KVPair struct {  
   Key string  
 Val float64  
}  
  
tmpList := make([]KVPair, 0)  
  
for k, v := range result {  
   tmpList = append(tmpList, KVPair{Key: k, Val: v})  
}

上面創(chuàng)建了一個 結構體切片 ,然后將 map 的值添加到切片中。

第二步

在 go1.8 之后,引入了 sort.Slice() 方法,可以實現(xiàn)對 slice 進行排序,我們只需要傳入一個比較函數(shù)即可:

sort.Slice(tmpList, func(i, j int) bool {  
   return tmpList[i].Val < tmpList[j].Val // 升序  
})

第三步

然后,我們對排序后的 slice 進行 for-range 遍歷:

for _, pair := range tmpList { ?
? ?fmt.Printf("key: %v value: %v \n", pair.Key, pair.Val) ?
}

// 結果:
key: 城市D value: 10.39?
key: 城市E value: 333.33?
key: 城市C value: 500.26?
key: 城市B value: 1992.33?
key: 城市A value: 2334.2

可以看到,排序后的 slice 第一項就是我們想要的結果。

如果我們想要獲取其中 value 值最大的一項,只需要更改 sort.Slice 中的比較方法接口:

sort.Slice(tmpList, func(i, j int) bool {  
   return tmpList[i].Val > tmpList[j].Val // 降序  
 //return tmpList[i].Val < tmpList[j].Val // 升序})

總結

上面測試的完整代碼如下:

package main ?
??
import ( ?
? ?"fmt" ?
?"sort") ?
??
var result = map[string]float64{ ?
? ?"城市A": 2334.20, ?
?"城市B": 1992.33, ?
?"城市C": 500.26, ?
?"城市D": 10.39, ?
?"城市E": 333.33, ?
}

func main() {

? ?type KVPair struct { ?
? ? ? Key string ?
?? ? ?Val float64 ?
? ?} ?
??
? ?tmpList := make([]KVPair, 0) ?
??
? ?for k, v := range result { ?
? ? ? tmpList = append(tmpList, KVPair{Key: k, Val: v}) ?
? ?} ?
??
? ?sort.Slice(tmpList, func(i, j int) bool { ?
? ? ? //return tmpList[i].Val > tmpList[j].Val // 降序 ?
? ? ? return tmpList[i].Val < tmpList[j].Val // 升序?
? ?}) ?
??
? ?for _, pair := range tmpList { ?
? ? ? fmt.Printf("key: %v value: %v \n", pair.Key, pair.Val) ?
? ?} ?
}

總結

到此這篇關于Golang中Map按照Value大小排序的文章就介紹到這了,更多相關Golang中Map大小排序內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • go將request?body綁定到不同的結構體中教程

    go將request?body綁定到不同的結構體中教程

    這篇文章主要為大家介紹了go將request?body綁定到不同的結構體中教程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-10-10
  • GO語言基本類型分析

    GO語言基本類型分析

    這篇文章主要介紹了GO語言基本類型,較為詳細的分析了整形、浮點型、字符串、指針等類型的具體用法,是深入學習GO語言所必須掌握的重要基礎,需要的朋友可以參考下
    2014-12-12
  • 一文初探?Goroutine?與?channel基本用法

    一文初探?Goroutine?與?channel基本用法

    這篇文章主要為大家介紹了一文初探?Goroutine?與?channel基本用法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-02-02
  • Golang實現(xiàn)支付寶沙箱支付的方法步驟

    Golang實現(xiàn)支付寶沙箱支付的方法步驟

    本文主要介紹了Golang實現(xiàn)支付寶沙箱支付的方法步驟,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-04-04
  • goland2020.2.x永久激活碼破解詳細教程親測可用(Windows Linux Mac)

    goland2020.2.x永久激活碼破解詳細教程親測可用(Windows Linux Mac)

    這篇文章主要介紹了goland2020.2.x永久激活碼破解詳細教程親測可用(Windows Linux Mac) ,對goland激活碼注冊碼相關知識感興趣的朋友跟隨小編一起看看吧
    2020-11-11
  • golang并發(fā)下載多個文件的方法

    golang并發(fā)下載多個文件的方法

    今天小編就為大家分享一篇golang并發(fā)下載多個文件的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-07-07
  • 一文詳解Golang中的errors包

    一文詳解Golang中的errors包

    在 Golang 中,errors 包是用于處理錯誤的標準庫, errors 包提供的功能比較簡單,使用起來非常方便,接下來就具體講解一下 errors 包提供的幾個函數(shù),感興趣的小伙伴跟著小編一起來看看吧
    2023-07-07
  • Go中的fuzz模糊測試使用實戰(zhàn)詳解

    Go中的fuzz模糊測試使用實戰(zhàn)詳解

    這篇文章主要為大家介紹了Go中的fuzz模糊測試使用實戰(zhàn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-12-12
  • go語言中if語句用法實例

    go語言中if語句用法實例

    這篇文章主要介紹了go語言中if語句用法,以實例形式分析了if語句的定義及使用技巧,非常具有實用價值,需要的朋友可以參考下
    2015-02-02
  • Go讀取yaml文件到struct類的實現(xiàn)方法

    Go讀取yaml文件到struct類的實現(xiàn)方法

    本文主要介紹了Go讀取yaml文件到struct類,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-01-01

最新評論