2016-06-14 7 views
0

나는 SQL 결과를 동적으로 가져 오기 위해 무언가를하려고한다. 기본적으로 행과 구조체를 전달하여 함수를 실행하여 (데이터 유형을 얻고 하나를 만든다) 인터페이스로 리턴한다. 정렬.Golang 구조체/인터페이스

누구든지 내가 어떻게 알 수 있습니까? 내가 그나마

는 그것을 해결됩니다 동적으로 기능을 변경

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

왜 값을 저장하기 위해 새 인터페이스를 사용자 정의하는 것을 고집하고 있습니까? 대상 유형이 무엇인지 알 필요없이 행을 검색하는 방법을 원한다는 것입니까? 체크 아웃 할 가치가 있습니다. [sqlx] (https://github.com/jmoiron/sqlx), 데이터베이스에 몇 가지 추가 메소드를 추가하여 각 필드를 명시 적으로 또는 슬라이스로 제공하는 대신 구조로 직접 스캔 할 수 있습니다. 이를 통해 스캔 기능은 인터페이스를 받아 들여 db.Select() 또는 db.Get()에 맹목적으로 전달하면됩니다. – Kaedys

+0

오, 음, 고마워. –

답변

1

StructRow

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 
} 

하지 않는 것입니다 .. PARAM으로 직접 "사용자"구조체를 전달합니다. 그렇 겠지. 반영 패키지에 대한 자세한 내용은 다음으로 이동하십시오. https://golang.org/pkg/reflect/

+0

고마워요 :) 당신은 내가 StructRow와 StructForScan을 같은 기능으로 결합 할 수 있다는 것을 알고 있습니까? –

+0

당신이 구현 한 방법은 꽤 똑바로 생각합니다 :). 또한 위의 설명에서 설명한 것처럼 https://github.com/jmoiron/sqlx에서 살펴보십시오. 나는 또한했다. 그것은 꽤 굉장합니다. –