ゴー言語は、ユーザーの構造から値名を取得するには、user.Name文法を提供します。だから我々は彼らを支援するつもり名前の変数になりたい場合は?
原型:getStructField(入力インタフェース{}、キーストリング)(値インタフェース{}、ERRエラー)
機能:入力構造は、キーフィールドに対応する値を削除します
コードの実装:
パッケージutilsの インポート( 「エラーは、」 「FMT 」 「反映します」 ) FUNC GetStructStringField(入力インターフェイス{}、キーストリング)(値の列、ERRエラー){ V、ERR: = getStructField(入力、キー) であれば!ERR = nilの{ リターン } 値は、[OK]: = V(文字列) であれば!OK { 戻り値、errors.New(「文字列にkey'v変換することはできません」) } リターン } FUNC GetStructFloat64Field(入力インターフェイス{}、キーストリング)(値のfloat64、ERRエラー){ V、ERR: = getStructField(入力、キー) であれば!ERR = nilの{ リターン } 値、[OK]: = 。V(のfloat64) であれば!OK { 戻り値、errors.New(「のfloat64にkey'v変換できません」) } リターン } FUNC getStructField(入力インターフェイス{}、キーストリング)(値インタフェース{}、ERRエラー){ RV: = reflect.ValueOf(入力) RT: = reflect.TypeOf(入力) であれば!rt.Kind()= reflect.Struct { 戻り値は、errors.New(「入力は、構造体でなければなりません」) } keyExist: = falseの ための I:= 0 ; I <rt.NumField(); I ++ { curField: = rv.Field(I) もし rt.Field(I).NAME == キー{ スイッチcurField.Kind(){ ケースreflect.String、reflect.Int64、reflect.Int32、reflect.Int16、reflect.Int8、reflect.Int、reflect.Float64、reflect.Float32: keyExist = 真 値 = curField.Interface() デフォルト: 戻り値、errors.New(「キーがintフロートまたは文字列でなければなりません」) } } } もし!keyExist { 戻り値、errors.New(FMT .Sprintf(" %sののフィールドでは見られないキー%sの" 、キー、RT)) } リターン }
テスト:
FUNC TestGetStructFiled(T * testing.T){ USER1:= {ユーザー ID:1、 NAME: "AAA"、 } V、ERR:= GetStructStringField(USER1、 "NAME") fmt.Println(V、ERR) }
テスト結果
AAA <ゼロ>