我有一片结构体。
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"?
key="key1"
用一个简单的for循环:
for
for _, v := range myconfig { if v.Key == "key1" { // Found! } }
请注意,由于切片的元素类型是 a struct(不是指针),如果结构类型“大”,这可能效率低下,因为循环会将每个访问过的元素复制到循环变量中。
struct
range只在索引上使用循环会更快,这样可以避免复制元素:
range
for i := range myconfig { if myconfig[i].Key == "key1" { // Found! } }
笔记:
这取决于您的情况,多个配置是否可能存在相同的key,但如果没有,break如果找到匹配项,您应该退出循环(以避免搜索其他配置)。
key
break
for i := range myconfig { if myconfig[i].Key == "key1" { // Found! break } }
此外,如果这是一个频繁的操作,你应该考虑map从中构建一个你可以简单地索引的,例如
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 }