2016-07-29 81 views
14

我有一個結構片。如何搜索golang片中的元素

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) 

Here is the output of this 
[{key1 test} {web/key1 test2}] 

我該如何搜索這個數組來獲取元素key="key1"

+0

作爲您的配置結構看起來像一個簡單的地圖我要指出的是,你可以在任何JSON數據解碼爲'地圖[字符串]接口{}'。如果你有興趣,結賬[這個官方博客文章](https://blog.golang.org/json-and-go) – tsabsch

回答

25

用一個簡單的for循環:

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

注意,由於切片的元素類型是struct(不是指針),這可能是效率低下的,如果結構類型是「大」作爲循環將將每個訪問元素複製到循環變量中。

這將是更快地使用一個range環路剛上索引,這樣就避免了複製的元素:

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

注:

這取決於你的情況多CONFIGS是否可以存在同樣的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 
} 
+0

謝謝我也可以自由使用指針。你認爲在這裏使用指向struct的指針會更快嗎?我們可以有一個指針數組嗎? – aaj

+0

@ love2code是的,你也可以使用指針片斷,或者如果你遍歷索引(如我的第二個例子),那麼值將不會被複制。由你決定。 – icza

+0

好的我創建了'var myconfig [] * Config'並使用了你的第一種方法。我希望這是最好的選擇性能明智 – aaj

2

您可以通過匹配結構KeyValue組件,其虛構鍵和值部分在地圖上保存的結構成圖:使用golang 逗號確定成語

mapConfig := map[string]string{} 
for _, v := range myconfig { 
    mapConfig[v.Key] = v.Value 
} 

然後你可以測試關鍵的存在:

if v, ok := mapConfig["key1"]; ok { 
    fmt.Printf("%s exists", v) 
} 
1

這沒有庫函數。你必須自己編碼。

for _, value := range myconfig { 
    if value .Key == "key1" { 
     // logic 
    } 
} 

工作代碼:https://play.golang.org/p/IJIhYWROP_

package main 

import (
    "encoding/json" 
    "fmt" 
) 

func main() { 
    type Config struct { 
     Key string 
     Value string 
    } 

    var respbody = []byte(`[ 
     {"Key":"Key1", "Value":"Value1"}, 
     {"Key":"Key2", "Value":"Value2"} 
    ]`) 

    var myconfig []Config 

    err := json.Unmarshal(respbody, &myconfig) 
    if err != nil { 
     fmt.Println("error:", err) 
    } 

    fmt.Printf("%+v\n", myconfig) 

    for _, v := range myconfig { 
     if v.Key == "Key1" { 
      fmt.Println("Value: ", v.Value) 
     } 
    } 

}