一尘不染

如何在golang切片中搜索元素

go

我有一片结构体。

type Config struct {
    Key string
    Value string
}

// I form a slice of the above struct
var myconfig []Config 

// unmarshal a response body into the above slice
if err := json.Unmarshal(respbody, &myconfig); err != nil {
    panic(err)
}

fmt.Println(config)

这是输出:

[{key1 test} {web/key1 test2}]

如何搜索此数组以获取元素 where key="key1"


阅读 558

收藏
2021-12-02

共1个答案

一尘不染

用一个简单的for循环:

for _, v := range myconfig {
    if v.Key == "key1" {
        // Found!
    }
}

请注意,由于切片的元素类型是 a struct(不是指针),如果结构类型“大”,这可能效率低下,因为循环会将每个访问过的元素复制到循环变量中。

range只在索引上使用循环会更快,这样可以避免复制元素:

for i := range myconfig {
    if myconfig[i].Key == "key1" {
        // Found!
    }
}

笔记:

这取决于您的情况,多个配置是否可能存在相同的key,但如果没有,break如果找到匹配项,您应该退出循环(以避免搜索其他配置)。

for i := range myconfig {
    if myconfig[i].Key == "key1" {
        // Found!
        break
    }
}

此外,如果这是一个频繁的操作,你应该考虑map从中构建一个你可以简单地索引的,例如

// Build a config map:
confMap := map[string]string{}
for _, v := range myconfig {
    confMap[v.Key] = v.Value
}

// And then to find values by key:
if v, ok := confMap["key1"]; ok {
    // Found
}
2021-12-02