Отдавайте предпочтение strconv перед fmt

При преобразовании примитивов в строки или из строк в примитивы strconv быстрее, чем fmt.

Не рекомендуется:

for i := 0; i < b.N; i++ {
  s := fmt.Sprint(rand.Int())
}

Рекомендуется:

for i := 0; i < b.N; i++ {
  s := strconv.Itoa(rand.Int())
}

Избегайте преобразования строк в байты

Избегайте повторного создания среза байтов из фиксированной строки. Вместо этого выполните преобразование один раз и сохраните результат.

Не рекомендуется:

for i := 0; i < b.N; i++ {
  w.Write([]byte("Hello world"))
}

Рекомендуется:

data := []byte("Hello world")
for i := 0; i < b.N; i++ {
  w.Write(data)
}

Укажите емкость контейнера

Укажите емкость контейнера, если это возможно, чтобы предварительно выделить память для контейнера. Это минимизирует последующие выделения (путем копирования и изменения размера контейнера) при добавлении элементов.

Подсказка емкости для map

В большинстве случаев предоставьте информацию о емкости при инициализации с помощью make().

make(map[T1]T2, hint)

Предоставление подсказки о емкости для make() попытается изменить размер карты при инициализации, уменьшая повторное выделение памяти при добавлении элементов в карту.

Обратите внимание, что, в отличие от срезов, подсказка емкости карты не гарантирует полного предварительного выделения, но используется для оценки необходимого количества корзин хэш-таблицы. Следовательно, выделение памяти все равно может происходить при добавлении элементов в карту, даже при указании емкости карты.

Не рекомендуется:

m := make(map[string]os.FileInfo)

files, _ := os.ReadDir("./files")
for _, f := range files {
    m[f.Name()] = f
}

// m создается без подсказки по размеру; может быть больше выделений во время выполнения.

Рекомендуется:

files, _ := os.ReadDir("./files")

m := make(map[string]os.FileInfo, len(files))
for _, f := range files {
    m[f.Name()] = f
}

// m создается с указанием подсказки по размеру; может быть меньше выделений во время выполнения.

Укажите емкость среза

В большинстве случаев предоставьте информацию о емкости при инициализации среза с помощью make(), особенно при добавлении в срез.

make([]T, length, capacity)

В отличие от карт, емкость среза не только подсказка: компилятор выделит достаточно памяти для предоставленной емкости среза в make(), что означает, что последующие операции append() приведут к нулевым выделениям (до тех пор, пока длина среза не совпадет с его емкостью, после чего любое добавление может изменить размер для вмещения дополнительных элементов).

Не рекомендуется:

for n := 0; n < b.N; n++ {
  data := make([]int, 0)
  for k := 0; k < size; k++{
    data = append(data, k)
  }
}

Рекомендуется:

for n := 0; n < b.N; n++ {
  data := make([]int, 0, size)
  for k := 0; k < size; k++{
    data = append(data, k)
  }
}