Как вызвать сбой strings.FieldsFunc в Go
В документации FieldsFunc сказано:
Если f не возвращает согласованные результаты для данного c, FieldsFunc может аварийно завершить работу.
Эта функция написана на самом Go, и ее текущая реализация говорит обо всем…
Входная строка проходит дважды. Один раз, чтобы получить числовые поля, которые используются для выделения результирующего среза (и базового массива):
// Now create them. a := make([]string, n)
Во время 2-го обхода a заполняется найденными полями. Как же тогда вылететь из этой функции? Достаточно зарезервировать слишком мало памяти после первого цикла:
package main import ( "strings" ) func main() { found := false strings.FieldsFunc("bad", func(char rune) bool { if char == 'a' { if !found { found = true return false } return true } return false }) }
Во время первого цикла будет обнаружено только одно поле (вся входная строка). После вызова буквы «а» вернется истина, что означает, что во время второго прохода будут обнаружены два поля. Когда место только для одного поля, это плохо.