Я пытаюсь выучить го. Я работаю над демаршированием CSV-записей в структуры, чтобы я мог затем создать вставки и импортировать эти данные в свою БД.
Я ищу способ автоматизации маршалинга, аналогично кодированию
Когда я запускаю main, я получаю сообщение об ошибке
panic: strconv.ParseInt: parsing "id": invalid syntax
Я написал некоторый код, который должен демонтировать мои записи .csv в struct
func Unmarshal(reader *csv.Reader, v interface{}) error {
record, err := reader.Read()
if err != nil {
return err
}
s := reflect.ValueOf(v).Elem()
if s.NumField() != len(record) {
return &FieldMismatch{s.NumField(), len(record)}
}
for i := 0; i < s.NumField(); i++ {
f := s.Field(i)
switch f.Type().String() {
case "string":
f.SetString(record[i])
case "int":
ival, err := strconv.ParseInt(record[i], 10, 0)
if err != nil {
return err
}
f.SetInt(ival)
default:
return &UnsupportedType{f.Type().String()}
}
}
return nil
}
Я создалэта структура в другом файле:
type InsertToDatabase struct {
ID int `csv:"id"`
groupId int `csv:"group_id"`
Name string `csv:"name"`
Status int `csv:"status"`
}
Когда запускается main, он должен выполнить этот бит кода и затем проанализировать мой файл .csv для создания вставок, которые затем запускаются в моей локальной БД.
var InsertTest InsertToDatabase
reader := csv.NewReader(file)
for {
err := Unmarshal(reader, &InsertTest)
if err == io.EOF {
break
}
if err != nil {
panic(err)
}
channel <- InsertTest
}
}
Есть ли способ улучшить читабельность этого кода? Кроме того, должен ли я выполнить цикл и вызвать .Read
для обработки одной строки за раз?