如何在Go中创建不区分大小写的地图?

San*_*ira 14 go

我想要一个键不敏感的字符串作为键.它是由语言支持还是我必须自己创建?谢谢

编辑:我正在寻找的是默认情况下制作它的方法,而不是每次我使用地图时都要记住转换键.

Son*_*nia 11

编辑:我的初始代码实际上仍然允许映射语法,因此允许绕过方法.这个版本更安全.

你可以"派生"一种类型.在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)
}
Run Code Online (Sandbox Code Playgroud)

  • 映射到小写不适用于Unicode数据,仅适用于ASCII.你应该在这里映射到Unicode foldcase,而不是小写.否则你的是一个Sisyphean任务,因为`Σίσυφος`的小写是`σίσυφος`,而它的大写的小写`ΣΊΣΥΦΟΣ`是正确的`σίσυφοσ`,这确实是所有这些的折叠.你现在明白为什么Unicode有一个单独的地图吗?案例映射过于复杂,无法盲目映射到任何非为此明确目的而设计的内容,因此Unicode套管表中存在第4个案例图:大写,标题,小写,折叠. (8认同)
  • 要求是字符串.Go将Unicode用于字符串,而不是ASCII.他们要求一个不区分大小写的地图.您提供了一个仅限ASCII的解决方案,而没有晚上打扰提到这一点.我的评论完全是关于主题的,因为你没有回答问题和措辞的问题,它没有ASCII限制.现在,事实证明这个人实际上除了ASCII之外什么也没有,所以即使在一般情况下它是错误的,你的解决方案也会被偷走.编写适用于Unicode的解决方案,它们也适用于ASCII - 但反过来却不成立,这就是为什么你的代码有问题. (3认同)