英文:
Idiomatic else if chain for a map key
问题
我有一个相当长的else if链,用于在映射中查找键并设置特定的值(如果找到)。我选择用最少的代码来实现,代码如下(m
是一个map[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
来设置一个变量。有没有一种惯用的方法来做到这一点?我觉得这种方式不会立即清楚我想要做什么。
英文:
I have a fairly long else if chain looking for keys in a map and setting a specific value if found. The way I chose to do it with the least amount of code was this (m
is a map[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)
This feels kinda clunky, I am doing all of these else if
's to set a variable in the condition. Is there an idiomatic way to do this? I think this way doesn't make it immediately obvious what I am trying to do.
答案1
得分: 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
英文:
For example,
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)
}
Output:
valuen
答案2
得分: 1
实际上,我认为你提供的代码非常容易阅读和理解。它有点啰嗦,但没有什么神奇的东西;)。所以如果只有一个地方需要编写这段代码,我会保持原样。如果你需要多次编写它,我会考虑编写另一个评论中提到的findValue
函数。
英文:
Actually I think the code you provided is very easy to read and understand. It is a bit verbose but there is no magic ;). So if there is only one place where you have to write this code I would leave it as it is. If you need to write it a few times I would consider writing findValue
function mentioned in another comment.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论