为了账号安全,请及时绑定邮箱和手机立即绑定

从数组/切片中获取元素索引或从 Go 中的映射获取值的键?

从数组/切片中获取元素索引或从 Go 中的映射获取值的键?

Go
慕工程0101907 2021-11-01 10:58:38
我有一个枚举的字符串列表(它们是常量,例如国家列表),我希望在提供枚举的 int 值时能够获取字符串,反之亦然能够获取枚举的 int 值提供字符串时。这是为了在数据库事务的两者之间进行转换。var MyData = [...]string {  "string1", // index 0  "string2", // index 1  "string3", // index 2  }对于像 python 这样的语言来说,这很容易,只需执行 MyData[1] 之类的操作即可获得 "string2" 和 MyData.index("string2") 以获得 1。一些可能的解决方案是编写我自己的函数以通过迭代数组/切片来获取索引对数组/切片进行排序并使用搜索函数返回索引(尽管这不允许未排序的序列,这是我更喜欢的)维护一个映射和一个彼此镜像的数组,这很容易出错。说到地图,可以访问特定值的键吗?然后我可以简单地拥有一个如下所示的地图,并且能够在提供 int 值时获取字符串键。var MyData = map[string]int {  "string1": 0,  "string2": 1,  "string3": 2,}更新:在我接受我的答案之前,我想更彻底地解释这个问题,我知道这一定是相当普遍的。我基本上有一组常量字符串(例如国家/地区列表),每个字符串都有一个关联的整数值。在我的数据库中,我只是存储整数以节省空间,因为有数百万个条目。但是当我显示数据库中的条目时,我需要显示字符串值以便用户可读。一个简单的数组就可以做到这一点。但是,我还需要向数据库添加条目(例如一个新人及其居住的国家/地区),并且在这种情况下需要从以表格形式输入的国家/地区字符串转换为该整数值。同样,这只是一个示例用例,但是目标保持不变。我需要一个可以在字符串值和枚举的 int 值之间双向转换的表。最明显的事情是维护一个数组(用于 int 到字符串的转换)和一个映射(用于字符串到 int 的转换)。我不想手动维护这两个变量,因为这很容易出错。所以我下面的解决方案是只维护一个数组,并在程序第一次运行时让构造函数方法在运行时自动构建映射。这样做的优点是,当我根据字符串(这是另一个建议的解决方案)获取整数值时,不需要遍历整个数组。
查看完整描述

3 回答

?
catspeake

TA贡献1111条经验 获得超0个赞

在这两种情况下,您都应该使用内置的 range 函数。


for k, v := range MyData {

}



for i, v := range ThisArray {

}



for i, _ := range ThisArrayIndexOnly {

    value := ThisArrayIndexOnly[i]

}

您可以在此range基础上构建辅助函数或任何您喜欢的功能,但从根本上说,它是可用于访问该数据的机制。如果你想要一个“indexof”函数,那就是


for i, v := range ArrayPassedIntoFunction {

     if v == ValuePassedIntoFunction {

          return i

     }

}

return -1

为了获得价值,您当然只需MyArray[i]包括边界检查或其他任何内容。请注意,上面的伪代码的编写风格表明它是一个数组,但实际上相同的代码适用于地图,我通常只使用 var 名称k而不是i.


查看完整回答
反对 回复 2021-11-01
?
拉风的咖菲猫

TA贡献1995条经验 获得超2个赞

假设你想在数组的数据中获取单词的索引


data := [...] {"one","two","three"}

或定长数组


data := [3] {"one","two","three"}

创建函数


func indexOf(word string, data []string) (int) {

    for k, v := range data {

        if word == v {

            return k

        }

    }

    return -1

}

从上面的函数中获取值,匹配类型,传递数组array[:]如下


fmt.Println(indexOf("two", data[:]))


查看完整回答
反对 回复 2021-11-01
?
眼眸繁星

TA贡献1873条经验 获得超9个赞

这是我之前提到的一个解决方案,它适用于静态切片(这是我的用例)。每次我想要一个值的索引时迭代切片都会增加不必要的延迟,特别是因为我的数据在运行时是静态的。这只是创建一个结构体,它初始化切片并创建相应的逆映射。然后我将使用 GetKey 和 GetVal 方法通过提供 int 'value' 来获取字符串 'key',或者通过提供字符串 'key' 来获取 int 'value'。也许已经有一种方法可以在 Go 中获取地图特定值的键。


type MyData struct {

    dataslice []string

    datamap map[string]int

}


func NewMyData() *MyData {

    m := new(MyData)

    m.dataslice= []string {

        "string1",

        "string2",

        "string3",

    }

    m.datamap = make(map[string]int)

    for x := range m.dataslice {

        m.datamap[m.dataslice[x]] = x

    }

    return m

}


func (m *MyData) GetKey(x int) string {

    return m.dataslice[x]

}


func (m *MyData) GetVal(x string) int {

    return m.datamap[x]

}


查看完整回答
反对 回复 2021-11-01
  • 3 回答
  • 0 关注
  • 383 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信