В Go нет функций strings.HasPrefix и strings.HasSuffix? Как проверить начало и конец строки?
Ответ: В Go есть функции strings.HasPrefix и strings.HasSuffix
Не волнуйтесь, в Go действительно есть нужные вам функции, просто они называются немного иначе, чем в Python. Пакет strings предоставляет функции HasPrefix и HasSuffix для проверки начала и конца строки соответственно. Они полностью решают вашу задачу без необходимости писать костыли с нарезкой строк.
Вот как вы можете использовать их в вашем примере с парсингом логов:
package main
import (
"fmt"
"strings"
)
func main() {
line := "[ERROR] something went wrong"
if strings.HasPrefix(line, "[ERROR]") {
fmt.Println("Это ошибка")
}
// Проверка конца строки
message := "System failure: CRITICAL"
if strings.HasSuffix(message, "CRITICAL") {
fmt.Println("Критическая ошибка")
}
// Пример с разными префиксами
logLines := []string{
"[INFO] server started",
"[WARN] disk space low",
"[ERROR] connection lost",
"[DEBUG] variable x = 42",
}
for _, log := range logLines {
switch {
case strings.HasPrefix(log, "[ERROR]"):
fmt.Println("Ошибка:", log)
case strings.HasPrefix(log, "[WARN]"):
fmt.Println("Предупреждение:", log)
case strings.HasPrefix(log, "[INFO]"):
fmt.Println("Информация:", log)
default:
fmt.Println("Другое:", log)
}
}
}
Ключевые особенности:
- HasPrefix(s, prefix string) bool — проверяет, начинается ли строка s с подстроки prefix
- HasSuffix(s, suffix string) bool — проверяет, заканчивается ли строка s на подстроку suffix
- Обе функции возвращают
trueилиfalse - Регистр символов учитывается (как и в Python)
- Работают с пустыми строками (пустая строка считается префиксом/суффиксом для любой строки)
Почему ваш "костыль" — плохая практика?
Ваш подход с line[:7] == "[ERROR]" имеет несколько проблем:
- Если строка короче 7 символов, программа упадёт с panic (выход за границы среза)
- Код менее читаемый и понятный
- Не обрабатывает случай, когда строка пустая
Используйте strings.HasPrefix и strings.HasSuffix — это идиоматичный, безопасный и эффективный способ проверки начала и конца строк в Go. Функции реализованы нативно и работают быстро, без создания временных подстрок.
Также обратите внимание на родственные функции: strings.TrimPrefix и strings.TrimSuffix — они удаляют префикс/суффикс, если он есть, иначе возвращают исходную строку без изменений.
Альтернативный подход: использование регулярных выражений
Хотя strings.HasPrefix и strings.HasSuffix — это стандартное и наиболее эффективное решение, в некоторых случаях вам может понадобиться более гибкая проверка, например, с игнорированием регистра или с использованием шаблонов. Для этого можно применить пакет regexp:
package main
import (
"fmt"
"regexp"
)
func main() {
line := "[ERROR] something went wrong"
// Проверка с игнорированием регистра
pattern := `(?i)^\[error\]`
matched, _ := regexp.MatchString(pattern, line)
if matched {
fmt.Println("Начинается с [ERROR] (регистр не важен)")
}
// Проверка суффикса с шаблоном
line2 := "file.txt"
pattern2 := `\.(txt|md)$`
matched2, _ := regexp.MatchString(pattern2, line2)
if matched2 {
fmt.Println("Файл имеет расширение .txt или .md")
}
}
Однако помните: регулярные выражения медленнее, чем встроенные функции HasPrefix/HasSuffix, и их следует использовать только тогда, когда нужна дополнительная гибкость (например, проверка нескольких вариантов сразу или игнорирование регистра). Для простых случаев всегда предпочитайте strings.HasPrefix и strings.HasSuffix.
Ответов пока нет.
Войдите чтобы оставить ответ
Блоги