2016-06-14 32 views
0

私はSQLの結果を動的に構造化するために何かをしようとしていますが、基本的には行と構造体を渡して関数を実行して(データ型を取得して1つ作成する)アレイ。Golang構造体/インタフェース

誰でもどのようにすればいいですか?私はいけない

がPARAMとして直接「ユーザー」構造体を渡したい...それは、動的に

type User struct{ 
    Id_user int `json:"id_user"` 
    Name string `json:"name"` 
    Email string `json:"email"` 
    Username string `json: "username"` 
} 

func main() { 
    var user User 
    rows, _ := db.Query("SELECT id_user, name, email, username FROM users") 
    json.NewEncoder(w).Encode(StructRow(user, rows)) 
} 

func StructRow(u interface{}, rows *sql.Rows)[]interface{}{ 
    var data []interface{} 
    for rows.Next() { 

     //How i can create a "user" here, dynamically 
     //for Example 
     //var user reflect.TypeOf(u) 

     _ = rows.Scan(StrutForScan(&user)...) 
     data = append(data, user) 
    } 
    return data 
} 

func StrutForScan(u interface{}) []interface{} { 
    val := reflect.ValueOf(u).Elem() 
    v := make([]interface{}, val.NumField()) 
    for i := 0; i < val.NumField(); i++ { 
     valueField := val.Field(i) 
     v[i] = valueField.Addr().Interface() 
    } 
    return v 
} 
+0

[ORM](https://github.com/jinzhu/gorm)が役立つと思います。 –

+0

なぜ値を格納するための新しいインターフェイスをカスタムビルドすることを主張していますか?目的のタイプが何であるかを知らなくても行をスキャンするメソッドを用意したいだけですか?チェックする価値があるかもしれませんが、データベースにいくつかのメソッドを追加して、各フィールドを明示的にまたはスライスする代わりに構造体に直接スキャンできるようにします。これで、あなたのスキャン関数はインターフェイスを受け入れ、 'db.Select()'や 'db.Get()'に無意識に渡すだけでよいのです。 – Kaedys

+0

ああ、まあ、ありがとう。 –

答えて

1

ない

func StructRow(u interface{}, rows *sql.Rows) []interface{} { 
    var data []interface{} 
    for rows.Next() { 

     t := reflect.TypeOf(u) 
     val := reflect.New(t).Interface() 

     errScan := rows.Scan(StrutForScan(val)...) 
     if errScan != nil { 
      //proper err handling 
     } 
     data = append(data, val) 
    } 
    return data 
} 

にあなたの関数StructRowを変更すると、それを修正します。私は推測する。 リフレクトパッケージの詳細については、https://golang.org/pkg/reflect/

+0

ありがとう:) 私は同じ機能でStructRowとStructForScanをどのように組み合わせることができますか? –

+0

私はあなたが実装した方法はかなり簡単だと思います:)。また、上記のコメントに記載されているように、https://github.com/jmoiron/sqlxをご覧ください。私もやった。それはかなり素晴らしいです。 –

関連する問題