我們假設我有一張地圖:map[string]string
。我想獲得這張地圖的排序鍵列表。所以我可以做這樣的事情:如何在Go中獲得已排序的地圖鍵列表?
func SortedMapKeys(m map[string]string) (keyList []string) {
for key := range m {
keyList = append(keyList, key)
}
sort.Strings(keyList)
return
}
然後,我將有另一種類型的地圖map[string]bool
。我想獲得它的鑰匙也。但問題是函數SortedMapKeys接受map[string]string
參數。所以我需要編寫完全相同的功能,只有一個區別 - 它會接受map[string]bool
。
由於顯而易見的原因,它不是一個選項。如果有一天我想改變我如何得到和排序我的密鑰的邏輯,我將需要跟蹤和更新所有這些功能。此外,我將不得不爲所有這些函數編寫相同的單元測試,因爲它們的實體是100%相等的(代碼複製),所以這些函數實際上執行相同的操作。
有什麼辦法可以創建一個通用函數,它可以接受任何的map[string]
?
謝謝您的回答,但我不知道,這在解決任務的慣用方式。仍然。由於我重複了收集鍵的邏輯(即使它在同一個方法中),我將不得不編寫單元測試來檢查每個重複的代碼片段。如果有一天我會支持5種地圖呢? 10? 20?如果這段代碼將被組織爲一個庫,並且程序員將要收集map [string] SomeCustomStruct的密鑰,該怎麼辦? – RhinoLarva