2015-05-27 51 views
0

我有一個相當長的其他鏈,如果鏈在地圖中查找鍵和設置一個特定的值,如果找到。我選擇用最少的代碼量做到這一點的方式是這樣的(mmap[string]interface{}地圖其他如果鏈地圖鍵

var ok bool 
var s interface{} 
if s, ok = m["key1"]; ok { 
} else if s, ok = m["key2"]; ok { 
      .... 
} else if s, ok = m["keyN"]; ok { 
} else { 
    return RuhRohError 
} 
g.Id = s.(string) 

這感覺有點笨重,我做的所有這些else if的來設置的條件變量。有沒有一種慣用的方式來做到這一點?我認爲這種方式並沒有讓我立即明白我在做什麼。

回答

2

例如,

package main 

import "fmt" 

func findValue(m map[string]interface{}, keys []string) (interface{}, bool) { 
    for _, key := range keys { 
     if value, ok := m[key]; ok { 
      return value, true 
     } 
    } 
    return nil, false 
} 

func main() { 
    m := map[string]interface{}{"keyn": "valuen"} 
    keys := []string{"key1", "key2", "keyn"} 
    s, found := findValue(m, keys) 
    if !found { 
     return 
    } 
    id := s.(string) 
    fmt.Println(id) 
} 

輸出:

valuen 
+0

我正在考慮這個確切的解決方案。似乎有點可讀性。也可以使'findValue(m map [string] interface {},keys ... string)' – user3591723

1

其實我覺得你提供的代碼很容易閱讀和理解。它有點冗長,但沒有魔法;)。所以如果只有一個地方你必須寫這個代碼,我會保持原樣。如果你需要寫幾次,我會考慮寫另一個評論中提到的findValue函數。

+1

這就是我沒有寫findValue函數的原因。另外我相信使用':='不會起作用,因爲變量只在if語句的作用範圍內 – user3591723

+0

您是對的,我會更新我的評論 – kostya