1. ホーム
  2. go

[解決済み] golangのスライスで要素を検索する方法

2022-10-15 02:38:01

質問

構造体のスライスを持っています。

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}]

この配列から key="key1" ?

どのように解決するのですか?

単純な for ループを使用します。

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

なお、スライスの要素型は struct (であるため(ポインタではない)、構造体の型が "big" の場合、ループは訪れた各要素をループ変数にコピーするため、非効率的である可能性があります。

を使用する方が速いでしょう。 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
}