Golangのリフレクションを使った構造体のエレガントなソート機能
2022-02-14 15:21:20
私は最近インターンシップを始め、PythonとGolangをメインの技術スタックとして仕事をしています。コード構造は同じなのですが、比較項目が違うので、受け入れられません。
関数を比較します。
func reflectCmp(i, j interface{}, fieldName string) bool { // sort by incoming fieldName
valI := reflect.ValueOf(i).FieldByName(fieldName).Interface()
ValueOf(j).FieldByName(fieldName).Interface()
switch s := valI.(type) {
case string:
return s < valJ.(string)
case float64:
return s < valJ.(float64)
case int:
return s < valJ.(int)
default:
fmt.Println("The type is unknown")
}
return true
}
比較したいタイプをスイッチに追加するだけです。
という構造体があるとします。
type person struct {
Age int
Name string
Name string}
では、どのように仕分けるのでしょうか?
func main() {
pSlice := []person{{20,"a"},{15,"be"},{32,"cc"},{2,"aa"}}
var p person
typeOfA := reflect.TypeOf(p)
// Iterate through all members of the structure
for i := 0; i < typeOfA.NumField(); i++ {
// Get the structure field type for each member
fieldType := typeOfA.Field(i)
sort.Slice(pSlice,func(i, j int) bool {
return reflectCmp(pSlice[i],pSlice[j],fieldType.Name)
})
fmt.Println(pSlice)
}
}
結果を実行する
リフレクションを使えば、構造体がいくつのフィールドを持っていても、for sortで優雅にソートすることができるのです。
Golangで構造体をエレガントにソートするためにリフレクションを使用する方法についてのこの記事は終わりです。Golangで構造体をリフレクションする方法については、Script Houseの過去の記事を検索するか、以下の記事を引き続きご覧ください。
関連
-
Go言語基本変数宣言・初期化例詳細
-
Go言語の基本型と定数の使用例詳細
-
Golangの高性能な永続化ソリューションBoltDB Databaseの紹介
-
golang言語でのwasm環境構築の流れを詳しく説明します
-
Go並行プログラミング - sync.Onceの例
-
Go Pluginでプラグインプログラミングを簡単に実装する方法
-
Goはパニックによるプログラムクラッシュの問題を解決するためにdefer+recoverを使用します
-
go言語 yaml からマップへの変換、マップトラバーサルの実装
-
囲碁言語におけるCGOの実践的な使用
-
go 言語のデバッグ: exec: "gcc": 実行可能ファイルが %PATH% に見つからない
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン