

Size: a a a
# Human injectionИз сборника Big list of naughty strings — списка строк, которые приведут к проблемам для софта, который небрежно обрабатывает пользовательский ввод, конкретно здесь
#
# Strings which may cause human to reinterpret worldview
If you're reading this, you've been in a coma for almost 20 years now. We're trying a new technique. We don't know where this message will end up in your dream, but we hope it works. Please wake up, we miss you.
sortedIDs
— в ржавом варианте обход заканчивается, когда набирается достаточно подходящих строк.sortedByDateSpottedIDs
будет как минимум countIDsNeedToShow
строк — в варианте ниже итоговый вектор просто будет содержать меньше paging.limit
строк, если их не хватает (это, кстати, можно считать как плюсом, так и минусом, но надо отметить, что нарушение этого ожидания в оригинальном варианте вызовет панику из-за некорректного индекса, а в моём варианте можно постфактум проверить длину возвращённого вектора).func getIDsForTextSearch(Всё при нём: единственный цикл, один слайс с предварительно выделенной памятью, ранний выход из цикла при достижении нужного количества строк... Что же не так? А вот что: наглядность отсутствует напрочь. Помимо двух возвращаемых значений, есть две технические переменные, которые нужно менять, и три условных оператора, которые нужно расставить в правильном порядке — или получить странные баги. Также тут есть пара мест для того, чтобы сделать ошибку на единицу. Но технически это всё ещё достаточно простой код. Вот только с запашком. Я бы на код-ревью подумал бы, стоит ли такой код пускать в прод.
sortedIDs []string,
spottedIDsWithDocCount map[string]int,
paging paging,
) ([]string, int) {
idsForSearch := make([]string, 0, paging.Limit)
skip := paging.Offset
iterated := 0
total := 0
for _, id := range sortedCallIDs {
if iterated >= paging.Limit {
break
}
count, spotted := spottedIDsWithDocCount[id]
if !spotted {
continue
}
if skip > 0 {
skip--
continue
}
iterated++
idsForSearch = append(idsForSearch, id)
total += count
}
return idsForSearch, total
}
iterated
можно выкинуть и проверять длину idsForSearch
. Впрочем, моя позиция остаётся прежнейSelf::
😅char
, в Go это rune
. Эти типы, казалось бы, одинаковы: оба хранят юникодные символы, оба занимают 32 бита. Тем не менее, в плане диапазона приемлемых значений они заметно отличаются. Чем именно — подробно рассказывается в статье.