Как создать универсальный массив в GO?

У меня есть функция, которая должна получить модель GORM в качестве параметра, и в зависимости от модели, которую я получаю в качестве параметра, мне нужно создать массив (срез) на основе типа полученной структуры (модели Gorm). Как создать массив «записей» полученного типа модели?

func main() {
    db, err := gorm.Open(sqlite.Open(dbPath), &gorm.Config{})
    if err != nil {
        panic(err)
    }

    db.AutoMigrate(&models.Empresa{}, &models.Estabelecimento{})
    processFiles(db, "EMPRE", models.Empresa{})
    processFiles(db, "ESTABE", models.Estabelecimento{})
}

func processFiles(db *gorm.DB, contains string, model interface{}) {
    for _, fileName := range getCSVFiles(contains) {
        fmt.Println("Processing file", fileName)

        file, err := os.Open(filepath.Join(csvPath, fileName))
        if err != nil {
            panic(err)
        }
        defer file.Close()

        reader := csv.NewReader(file)
        reader.Comma = ';'

        records := ??? //create array by model struct type

        if err := gocsv.UnmarshalCSVWithoutHeaders(reader, &records); err != nil {
            panic(err)
        }
        fmt.Printf("Creating records in database... ")
        db.CreateInBatches(records, 50)
        fmt.Println("Done")
    }
}
Структурированный массив Numpy
Структурированный массив Numpy
Однако в реальных проектах я чаще всего имею дело со списками, состоящими из нескольких типов данных. Как мы можем использовать массивы numpy, чтобы...
T - 1Bits: Генерация последовательного массива
T - 1Bits: Генерация последовательного массива
По мере того, как мы пишем все больше кода, мы привыкаем к определенным способам действий. То тут, то там мы находим код, который заставляет нас...
Что такое деструктуризация массива в JavaScript?
Что такое деструктуризация массива в JavaScript?
Деструктуризация позволяет распаковывать значения из массивов и добавлять их в отдельные переменные.
0
0
57
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Передайте указатель на срез в качестве аргумента вместо создания среза.

func processFiles(db *gorm.DB, contains string, records interface{}) {
    for _, fileName := range getCSVFiles(contains) {
        fmt.Println("Processing file", fileName)

        file, err := os.Open(filepath.Join(csvPath, fileName))
        if err != nil {
            panic(err)
        }
        defer file.Close()

        reader := csv.NewReader(file)
        reader.Comma = ';'

        // note that argument is records, not &records
        if err := gocsv.UnmarshalCSVWithoutHeaders(reader, records); err != nil {
            panic(err)
        }
        fmt.Printf("Creating records in database... ")
        db.CreateInBatches(records, 50)
        fmt.Println("Done")
    }
}

Звонящий выглядит так:

var records []models.Empresa
processFiles(db, "EMPRE", &records)

Другие вопросы по теме