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