したがって、nil インターフェイス タイプのスライスを返すという考えは、間違いなく正しい方向に進んでいます。ただし、特定のメンバーにアクセスしたり、特定のメソッドを呼び出したりしようとすると、探している型がわからないため、問題が発生します。ここで、型アサーションが非常に便利になります。コードを少し拡張するには:
getPerson(typ string, field string, val string) []Person {
slice := getItems(typ, field, val)
output := make([]Person, 0)
i := 0
for _, item := range slice {
// Type assertion!
thing, ok := item.(Person)
if ok {
output = append(output, thing)
i++
}
}
return output
}
つまり、一般的な検索を実行し、正しいタイプのアイテムのみを除外します。具体的には、型アサーション:
thing, ok := item.(Person)
item
変数が typeであるかどうかを確認しPerson
、そうであれば値と true を返し、そうでなければ nil と false を返します (したがって、ok をチェックすると、アサーションが成功したかどうかがわかります)。
実際には、必要に応じて、これをさらに一歩進めて、getItems()
別のブール関数で関数を定義できます。基本的にはgetItems()
、関数を実行してデータベース内の各要素に渡し、要素で関数を実行して true が返された場合にのみ、その要素を結果に追加するという考え方です。
getItem(critera func(interface{})bool) []interface{} {
output := make([]interface{}, 0)
foreach _, item := range database {
if criteria(item) {
output = append(output, item)
}
}
}
(正直なところ、もしそれが私だったら、条件関数を受け入れるだけでなく、フィールドと値の文字列も受け入れる2つのハイブリッドを行うでしょう)