var digitRegexp = regexp.MustCompile("[0-9]+")
func FindDigits(filename string) []byte {
b, _ := ioutil.ReadFile(filename)
return digitRegexp.Find(b)
}
💬 В чем проблема кода, представленного выше?
Функция
FindDigits
загружает файл в память и ищет в нем первую группу подряд идущих цифр, возвращая их в виде нового среза.Этот код работает как заявлено, но возвращаемый
[]byte
указывает на массив, содержащий весь файл. Поскольку срез ссылается на оригинальный массив, пока срез сохраняется, сборщик мусора не может освободить массив; несколько полезных байтов файла удерживают в памяти все его содержимое.Чтобы исправить эту проблему, можно скопировать интересующие данные в новый срез перед их возвратом:
func CopyDigits(filename string) []byte {
b, _ := ioutil.ReadFile(filename)
b = digitRegexp.Find(b)
c := make([]byte, len(b))
copy(c, b)
return c
}
Более краткая версия этой функции также может быть создана с использованием
append.