我想要一个键不敏感的字符串作为键。 它是由语言支持还是我必须自己创建? 谢谢
编辑: 我正在寻找的是默认情况下制作它的方法,而不是每次我使用地图时都要记住转换键。
我想要一个键不敏感的字符串作为键。 它是由语言支持还是我必须自己创建? 谢谢
编辑: 我正在寻找的是默认情况下制作它的方法,而不是每次我使用地图时都要记住转换键。
编辑:我的初始代码实际上仍然允许映射语法,因此允许绕过方法。这个版本更安全。
你可以“派生”一种类型。在Go我们只是说声明。然后在类型上定义方法。它只需要一个非常薄的包装器来提供您想要的功能。但请注意,您必须使用普通方法调用语法调用get和set。没有办法保持内置映射的索引语法或可选的ok结果。
package main
import (
"fmt"
"strings"
)
type ciMap struct {
m map[string]bool
}
func newCiMap() ciMap {
return ciMap{m: make(map[string]bool)}
}
func (m ciMap) set(s string, b bool) {
m.m[strings.ToLower(s)] = b
}
func (m ciMap) get(s string) (b, ok bool) {
b, ok = m.m[strings.ToLower(s)]
return
}
func main() {
m := newCiMap()
m.set("key1", true)
m.set("kEy1", false)
k := "keY1"
b, _ := m.get(k)
fmt.Println(k, "value is", b)
}
两种可能性:
如果输入集保证仅限于转换为大写/小写将产生正确结果的字符,则转换为大写/小写(某些Unicode字符可能不是)
否则转换为Unicode折叠大小写:
使用 unicode.SimpleFold(rune)
将unicode符文转换为折叠大小写。显然,这比简单的ASCII风格的案例映射更加昂贵,但它对其他语言的可移植性也更高。看到 EqualsFold的源代码 了解如何使用它,包括如何从源字符串中提取Unicode符文。
显然,您将此功能抽象到一个单独的包中,而不是在使用地图的任何地方重新实现它。这应该不言而喻,但是你永远不会知道。