Двумерные срезы в Go

В языке программирования Go массивы и срезы являются одномерными. Для создания эквивалента 2-мерного массива либо среза надо определить массив массивов либо срез срезов. Давайте посмотрим, как это может выглядеть:

Так как срезы имеют переменную длину, то появляется возможность иметь каждый внутренний срез с различной длиной. В том же нашем LinesOfText-примере каждая строка обладает независимой длиной.

В некоторых случаях может понадобиться выделить двумерный срез. Такая ситуация может возникнуть, например, при обработке сканированных строк пикселей. Выделить 2-мерный срез можно двумя путями:

  1. Первый путь -- выделение каждого среза независимо.
  2. Второй способ заключается в выделении одного массива и указании отдельных срезов в нем.

Какой из этих путей использовать, будет зависеть от конкретного приложения. При этом стоит понимать, что если срезы могут расти либо уменьшаться, то их надо выделять независимо -- это позволит избежать перезаписи следующей строки. В обратном случае более эффективным будет построение объекта с однократной аллокацией.

Рассмотрим эти два способа подробнее. Первый вариант реализации, строка за раз:

Второй вариант реализации -- одно аллоцирование, которое разбито на строки:

По материалам сайта https://golang-blog.blogspot.com/.