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.