package main import ( "encoding/csv" "fmt" "log" "os" "strconv" ) func main() { fmt.Println("Enter Number:") var number int _, err := fmt.Scanf("%d", &number) if err != nil { log.Fatal(err) } matrice := make([][]int, number+1) for i := 0; i <= number; i++ { matrice[i] = make([]int, number+1) for j := 0; j <= number; j++ { matrice[i][j] = (j * i) % number } } // Save it if err := csvExport(matrice); err != nil { log.Fatal(err) } // output it fmt.Print("\t") for i := 0; i <= number; i++ { fmt.Print(i, "\t") } fmt.Println() for rownumber, row := range matrice { fmt.Print(rownumber, "\t") for _, col := range row { fmt.Print(col, "\t") } fmt.Println() } } func csvExport(data [][]int) error { file, err := os.Create("result.csv") if err != nil { return err } defer file.Close() writer := csv.NewWriter(file) defer writer.Flush() //Prepare dataStrings := make([][]string, len(data)) for in := range data { dataStrings[in] = make([]string, len(data[in])) for in2, val2 := range data[in] { dataStrings[in][in2] = strconv.Itoa(val2) } } for _, value := range dataStrings { if err := writer.Write(value); err != nil { return err // let's return errors if necessary, rather than having a one-size-fits-all error handler } } return nil }