(ジェネリック+を反映する)を取得言語の構造体からフィールド値を行きます

    ゴー言語は、ユーザーの構造から値名を取得するには、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 <ゼロ>

  

 

 

おすすめ

転載: www.cnblogs.com/zhongweikang/p/11861134.html