回答

收藏

如何在golang切片中搜索元素

技术问答 技术问答 191 人阅读 | 0 人回复 | 2023-09-12

我有结构体。- i1 `. G2 O' r7 l, G9 X" C
    type Config struct    Key string    Value string}// I form a slice of the above structvar myconfig []Config // unmarshal a response body into the above sliceif err := json.Unmarshal(respbody,&myconfig); err != nil    panic(err)}fmt.Println(config)3 D" Z. ]7 _$ {) }$ x6 K/ @
这是输出:
- N' L$ [) g4 A' s( q2 o& H
    [{key1 test} {web/key1 test2}]
    6 E5 t/ u: I' Y& {( Y" Z' f& Z' ?' m
如何搜索这个数组获取元素 where key="key1"?5 ~4 U5 p$ y4 ^+ d
                                                               
3 X) Z$ K( Z4 d- ~6 ]; z' z    解决方案:                                                                # C  O, l8 t5 I/ D6 i7 Q8 Z( k) |2 a
                                                                用简单的for循环:  e9 i* Q$ C! \0 Q+ I; d

    . l$ u* Z' w3 e! ~
  • for _,v := range myconfig    if v.Key == "key1"        // Found!  code]请注意,因为切片的元素类型是 a struct(不是指针),如果结构类型大) E0 G- ]2 b3 Y; W
  • range只在索引上使用循环更快,以避免复制元素:
    . m0 H; ~0 D# x
  • [code]for i := range myconfig    if myconfig.Key == "key1"        // Found!  code]笔记:
    1 m! M3 ?  b* w( I( T$ T% O( r" A  Y
  • 这取决于你的情况,多个配置是否可能相同key,但如果没有,break如果找到匹配项,应退出循环(避免搜索其他配置)。7 y5 `" H  m' p
  • [code]for i := range myconfig    if myconfig.Key == "key1"        // Found!        break  code]另外,如果这是一个频繁的操作,你应该考虑map构建一个你可以简单索引的,比如[code]// 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}
    ' k2 m0 U# V: ?1 X2 P5 E
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则