Go有类似Python的in关键字吗?我想检查一个值是否在列表中.
例如在Python中:
x = 'red'
if x in ['red', 'green', 'yellow', 'blue']:
print "found"
else:
print "not found"
Run Code Online (Sandbox Code Playgroud)
在Go中,我想出了使用set惯用法,但我不认为这是理想的,因为我必须指定一个我没有使用的int值.
x := "red"
valid := map[string]int{"red": 0, "green": 0,"yellow": 0, "blue": 0}
if _, ok := valid[x]; ok {
fmt.Println("found")
} else {
fmt.Println("not found")
}
Run Code Online (Sandbox Code Playgroud)
我知道有一个in关键字可能与泛型有关.有没有办法使用go generate或其他东西来做到这一点?
icz*_*cza 16
您可以使用a map[string]bool作为一组.当测试并且键不在映射中时,bool返回零值,即false.
因此,使用有效值作为键和true值填充地图.如果测试的键值在地图中,则其存储的true值将是结果.如果测试的键值不在映射中,则返回值类型的零值,即false.
使用它,测试变得如此简单:
valid := map[string]bool{"red": true, "green": true, "yellow": true, "blue": true}
if valid[x] {
fmt.Println("found")
} else {
fmt.Println("not found")
}
Run Code Online (Sandbox Code Playgroud)
在Go Playground上尝试(使用下面提到的变体).
博客文章中提到了这一点:Go map in action:利用零值
注意:
如果您有许多有效值,因为要存储在地图中的所有值都是true,使用切片列出有效值并使用for range循环初始化地图可能会更紧凑,如下所示:
for _, v := range []string{"red", "green", "yellow", "blue"} {
valid[v] = true
}
Run Code Online (Sandbox Code Playgroud)
笔记2:
如果您不想使用for range循环初始化,您仍然可以通过创建无类型(或bool类型)单字母来优化它const:
const t = true
valid := map[string]bool{"red": t, "green": t, "yellow": t, "blue": t}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5620 次 |
| 最近记录: |