プログラムに反映されて実行され、変数の値をチェックすることができ、それらの型が決定されます。
反映パッケージには、ランタイム・リフレクションを実装しています。
任意のデータ型のいずれかの値を受け取るために、クエリ文字列を作成します:
FUNCからCreateQuery(q個のインタフェース {})の文字列{ }
reflect.Typeインタフェース{}は、特定のタイプを表し、それは特定の値reflect.Valueを表します。reflect.TypeOf()とreflect.ValueOf()関数は、2つのreflect.Typeとreflect.Valueをそれぞれ返します。
Type
これは、を表し interface{}
(ここでの実際のタイプ main.Order
)、および Kind
(この場合には、このタイプの特定のカテゴリを表します struct
)。
NumField()
この方法は、構造体のフィールドの数を返し、 Field(i int)
この方法は、フィールド返す i
のを reflect.Value
。
FUNCからCreateQuery(q個のインタフェース{}){ もし reflect.ValueOf(Q).Kind()== reflect.Struct { V: = reflect.ValueOf(Q) fmt.Println(" フィールド数" 、v.NumField() ) のための I:= 0 ; 私はv.NumFieldを()<; I ++ { fmt.Printf(" フィールド:%のDタイプ:%のT値:%Vを\ n " 、I、v.Field(I)、v.Field(I)) } } }
INT と 文字列は 、それぞれ値reflect.ValueのInt64の文字列とすることができます。
メインパッケージ のインポート( " FMT " " 反映" ) 注文型構造体を{ ORDID INT はcustomerId INT } 入力従業員のstruct { 名 文字列 ID のint アドレス列 給与 INT 国文字列 } FUNCのからCreateQuery(q個のインタフェース{}){ もし reflect.ValueOf(Q ).Kind()== reflect.Struct { T: = reflect.TypeOf(Q).NAME() クエリ: = fmt.Sprintf(" %sの値(挿入" )、Tは V: = reflect.ValueOf(Q) 用 I:= 0 ; iはv.NumFieldを()<; iは++ { スイッチv.Field(i)を.Kind(){ ケースreflect.Int: もし I == 0 { クエリ = fmt.Sprintf(" %sの%のD " 、クエリ、v.Field(I).INT()) } 他{ クエリ = fmt.Sprintf (" %sの%d個"、クエリ、v.Field(I).INT()) } ケースreflect.String: もし I == 0 { クエリ = fmt.Sprintf(" %sの\" %sの\」" 、クエリ、v.Field(I ).String()) } 他{ クエリ = fmt.Sprintf(" %sは、\" %sの\」" クエリ、v.Field(I).String()) } デフォルト: fmt.Println(" サポートされていないタイプ" ) を返します } } クエリ = fmt.Sprintf("%S)" クエリ) fmt.Println(クエリ) リターン } fmt.Println(" サポートされていないタイプ」) } メインFUNC(){ O: = 順番{ ORDID:44 、 はcustomerId:100 、 } からCreateQuery(O) E: = 従業員{ 名: " 王" 、 アドレス: " HN " 、 国: " CN " 、 ID: 10000 、 給与: 10000 、 } からCreateQuery(E) I: = 100 からCreateQuery(I) } 出力: 順序値(挿入44、100 ) 従業員値(挿入、 " 王"、10000は、" HN "、10000、「CN 」) サポートされていないタイプ
参考:
1。 チュートリアルのシリーズを行く- 34.リフレクション
2。 反射-の基礎を行きます