golang之反射

プログラムに反映されて実行され、変数の値をチェックすることができ、それらの型が決定されます。

反映パッケージには、ランタイム・リフレクションを実装しています。

任意のデータ型のいずれかの値を受け取るために、クエリ文字列を作成します:

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)
} 
出力:
順序値(挿入44100 
従業員値(挿入、 " "10000は" HN "10000CN 
サポートされていないタイプ

 

参考:

1。         チュートリアルのシリーズを行く- 34.リフレクション

2。         反射-の基礎を行きます

おすすめ

転載: www.cnblogs.com/embedded-linux/p/11129047.html