1 回答

TA貢獻1895條經驗 獲得超3個贊
這是使用reflect 包的解決方案。使用指向切片的指針調用函數。
func GetAll(query string, dest interface{}) error {
? ? // Return error if dest is not a pointer to a slice.
? ? slice := reflect.ValueOf(dest)
? ? if slice.Kind() != reflect.Ptr {
? ? ? ? return errors.New("dest must be pointer")
? ? }
? ? slice = slice.Elem()
? ? if slice.Kind() != reflect.Slice {
? ? ? ? return errors.New("dest must be pointer to struct")
? ? }
? ? rows, err := db.Query(query)
? ? if err != nil {
? ? ? ? return err
? ? }
? ? defer rows.Close()
? ? for rows.Next() {
? ? ? ? // Create a new slice element. The variable elementp holds a?
? ? ? ? // pointer to the new element.
? ? ? ? elementp := reflect.New(slice.Type().Elem())
? ? ? ? err := rows.Scan(elementp.Interface())
? ? ? ? if err != nil {
? ? ? ? ? ? return err
? ? ? ? }
? ? ? ? // Append the element to the slice.
? ? ? ? slice.Set(reflect.Append(slice, elementp.Elem()))
? ? }
? ? return nil
}
當查詢結果只有一列并且 dest 是指向適合該列的類型的切片時,上面的代碼適用于標準的 database/sql 包。這是一個例子:
var names []string
if err := GetAll(db, "select name from people", &names); err != nil {
? ? // handle error
}
此代碼還應與支持將多列掃描到結構的數據庫包一起使用。
- 1 回答
- 0 關注
- 114 瀏覽
添加回答
舉報