Задача звучит просто, но у неё три разных ответа. Нужно узнать, есть ли подстрока вообще. Нужно узнать, где она находится. Нужно достать то, что вокруг неё. Для каждого случая в пакете
strings есть своя функция, и брать не ту это лишняя работа.Просто проверить наличие
if strings.Contains(s, "error") {
// подстрока есть
}
strings.Contains возвращает bool. Рядом живут strings.HasPrefix и strings.HasSuffix для начала и конца строки, они дешевле, потому что не сканируют всё подряд.if strings.HasPrefix(path, "/api/") {
...
}Ещё есть
strings.ContainsAny, которая проверяет вхождение любого символа из набора, и strings.ContainsRune для одной руны.Найти позицию
i := strings.Index(s, "role=")
if i == -1 {
return errors.New("not found")
}
strings.Index возвращает байтовый индекс первого вхождения либо -1. Проверка на -1 обязательна, иначе получите панику при попытке сделать срез. strings.LastIndex ищет с конца. strings.IndexByte работает с одним байтом и заметно быстрее, если ищете, например, запятую.Индекс байтовый, но подставлять его в срез безопасно. Совпадение подстроки всегда начинается на границе символа, потому что UTF-8 самосинхронизирующаяся кодировка.
Достать содержимое
Чаще всего индекс нужен не сам по себе, а чтобы отрезать кусок. Тогда
strings.Cut короче и понятнее.before, after, found := strings.Cut("key=value", "=")
if !found {
return errors.New("bad format")
}
// before "key", after "value"Это идиоматичный способ с Go 1.18. Он заменяет связку
Index плюс два среза и не даёт ошибиться со смещением на длину разделителя.🐸 Библиотека Go для собеса