代码之家  ›  专栏  ›  技术社区  ›  Gustavo Piucco

如何在GO中创建通用数组?

  •  0
  • Gustavo Piucco  · 技术社区  · 3 月前

    我有一个函数需要接收一个GORM模型作为参数,根据我接收的模型作为参数的不同,我需要根据我接收到的结构(GORM模型)的类型创建一个数组(Slice)。如何创建我收到的模型类型的“记录”数组?

    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")
        }
    }
    
    1 回复  |  直到 3 月前
        1
  •  2
  •   Minglewood Blues    3 月前

    将指针作为参数传递到切片,而不是创建切片。

    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)