{"record":{"id":"bfc0c9ef2d615ba1","repo":"TheAlgorithms/Go","slug":"rows-have-different-numbers-of-columns","errorCode":null,"errorMessage":"rows have different numbers of columns","messagePattern":"rows have different numbers of columns","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"math/matrix/matrix.go","lineNumber":45,"sourceCode":"\tfor i := range elements {\n\t\tgo func(i int) {\n\t\t\tdefer wg.Done()\n\t\t\telements[i] = make([]T, columns)\n\t\t\tfor j := range elements[i] {\n\t\t\t\telements[i][j] = initial\n\t\t\t}\n\t\t}(i)\n\t}\n\n\twg.Wait()\n\n\treturn Matrix[T]{elements, rows, columns}\n}\n\n// NewFromElements creates a new Matrix from the given elements.\nfunc NewFromElements[T constraints.Integer](elements [][]T) (Matrix[T], error) {\n\tif !IsValid(elements) {\n\t\treturn Matrix[T]{}, errors.New(\"rows have different numbers of columns\")\n\t}\n\trows := len(elements)\n\tif rows == 0 {\n\t\treturn Matrix[T]{}, nil // Empty matrix\n\t}\n\n\tcolumns := len(elements[0])\n\tmatrix := Matrix[T]{\n\t\telements: make([][]T, rows),\n\t\trows:     rows,    // Set the rows field\n\t\tcolumns:  columns, // Set the columns field\n\t}\n\tfor i := range matrix.elements {\n\t\tmatrix.elements[i] = make([]T, columns)\n\t\tcopy(matrix.elements[i], elements[i])\n\t}\n\n\treturn matrix, nil","sourceCodeStart":27,"sourceCodeEnd":63,"githubUrl":"https://github.com/TheAlgorithms/Go/blob/5ba447ec5ff3d1213de65b92e726ee74c5d5cc19/math/matrix/matrix.go#L27-L63","documentation":"NewFromElements rejects the input when IsValid(elements) fails, i.e. the rows of the 2-D slice do not all have the same number of columns. A matrix must be rectangular, so a jagged slice is invalid input.","triggerScenarios":"Calling NewFromElements with [][]T{{1,2},{3}} — one row longer than another. Also empty inner rows mixed with non-empty rows.","commonSituations":"Data loaded from user-supplied CSV/TSV where a row has a missing or extra field; hand-written literals with a typo; string splitting that produces trailing/missing separators.","solutions":["Validate the slice before construction: check len(row) is identical for every row.","Fix the offending row in the input data so all rows have equal length.","If ragged input is expected, pad missing cells with a zero value before calling NewFromElements."],"exampleFix":"// before\nm, err := math.NewFromElements([][]int{{1, 2}, {3}}) // error: jagged\n\n// after\nm, err := math.NewFromElements([][]int{{1, 2}, {3, 0}})","handlingStrategy":"validation","validationCode":"func validElements[T constraints.Integer](els [][]T) bool {\n    if len(els) == 0 {\n        return true\n    }\n    n := len(els[0])\n    for _, row := range els {\n        if len(row) != n {\n            return false\n        }\n    }\n    return true\n}\n\nif !validElements(raw) {\n    return errors.New(\"input rows must all have the same length\")\n}\nm, err := math.NewFromElements(raw)","typeGuard":"func isRectangular[T constraints.Integer](els [][]T) bool {\n    for _, row := range els {\n        if len(row) != len(els[0]) {\n            return false\n        }\n    }\n    return true\n}","tryCatchPattern":"m, err := math.NewFromElements(raw)\nif err != nil {\n    // raw is jagged: find and fix the offending row\n    return fmt.Errorf(\"invalid matrix input: %w\", err)\n}","preventionTips":["Validate external data (CSV/JSON rows) for equal lengths before building matrices.","Write a test that feeds a jagged slice and expects the error.","Pad missing fields at parse time instead of letting the constructor fail."],"tags":["matrix","jagged-slice","validation","go"],"backgroundTag":"ragged-input-data","analyzedSha":"5ba447ec5ff3d1213de65b92e726ee74c5d5cc19","analyzedAt":"2026-09-02T21:54:30.227Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-10T02:17:09.455Z"}