вторник, 10 марта 2020 г.

Обзор обработки строк в Golang

Строковые литералы (экранированные символы)

Выражение Результат Описание
"" Нулевое значение по умолчанию для типа string
"Japan 日本"
Japan 日本
Код Go это Unicode текст, кодированный в UTF‑8
"\xe6\x97\xa5" \xNN определяет byte
"\u65E5" \uNNNN определяет Unicode значение
"\\" \ Обратный слэш
"\"" " Двойная кавычка
"\n" Новая строка
"\t" Символ табуляции
`\xe6` \xe6 Необработанный строковый литерал
html.EscapeString("<>")
&lt;&gt; HTML экранирование для <, >, &, ' и "
url.PathEscape("A B")
A%20B URL %-кодирование net/url

В необработанных строковых литералах (заключены в обратные кавычки ``) текст интерпретируется буквально и обратные слэши не имеют специального значения.

Конкатенация

Выражение Результат Описание
"Ja" + "pan" Japan Конкатенация

Эквивалетность и сравнение (игнорируя регистр)

Выражение
Результат
Описание
"Japan" == "Japan" true Эквивалетность
strings.EqualFold("Japan", "JAPAN") true Сравнение Unicode с оберткой регистра
"Japan" < "japan" true Сравнение в лексикографическом порядке

Длина в байтах или рунах

Выражение
Результат
Описание
len("日") 3 Длина в байтах
utf8.RuneCountInString("日")
1 Длина в рунах unicode/utf8
utf8.ValidString("日") true Проверка UTF-8 ли переданная строка (unicode/utf8)

Индексирование, создание подстроки, итерация

Выражение Результат Описание
"Japan"[2] 'p' Байт в позиции 2
"Japan"[1:3] ap Индексирование байтов
"Japan"[:2] Ja
"Japan"[2:] pan

Цикл range в Go производит итерацию по UTF-8-кодированным символам (руны):

for i, ch := range "Japan 日本" {
    fmt.Printf("%d:%q ", i, ch)
}
// Вывод: 0:'J' 1:'a' 2:'p' 3:'a' 4:'n' 5:' ' 6:'日' 9:'本'

Итерация по байтам производит бессмысленные символы для не-ASCII текста:

s := "Japan 日本"
for i := 0; i < len(s); i++ {
    fmt.Printf("%q ", s[i])
}
// Вывод: 'J' 'a' 'p' 'a' 'n' ' ' 'æ' '\u0097' '¥' 'æ' '\u009c' '¬'

Поиск (contains, prefix/suffix, index)

Выражение
Результат
Описание
strings.Contains("Japan", "abc") false abc в Japan?
strings.ContainsAny("Japan", "abc") true a, b или c в Japan?
strings.Count("Banana", "ana") 1 не перекрывающиеся экземпляры ana
strings.HasPrefix("Japan", "Ja") true Japan начинается с Ja?
strings.HasSuffix("Japan", "pan") true Japan заканчивается на pan?
strings.Index("Japan", "abc") -1 Индекс первого abc
strings.IndexAny("Japan", "abc") 1 Индекс первого a, b или c
strings.LastIndex("Japan", "abc") -1 Индекс последнего abc
strings.LastIndexAny("Japan", "abc") 3 Индекс последнего a, b или c

Замена (uppercase/lowercase, trim)

Выражение
Результат
Описание
strings.Replace("foo", "o", ".", 2) f.. Замена первых двух “o” на “.”. Используйте -1, чтобы заменить все подходящие символы.

f := func(r rune) rune {
    return r + 1
}
strings.Map(f, "ab")

bc Применяет функцию к каждому символу
strings.ToUpper("Japan") JAPAN Приведение к верхнему регистру
strings.ToLower("Japan") japan Приведение к нижнему регистру
strings.Title("ja pan")
Ja Pan
Приведение к верхнему регистру первых букв
strings.TrimSpace(" foo\n") foo Удаление начального и завершающего пробела
strings.Trim("foo", "fo") Удаление начальных и завершающих f и s
strings.TrimLeft("foo", "f") oo Удаление начальных f
strings.TrimRight("foo", "o") f Удаление завершающих f
strings.TrimPrefix("foo", "fo") o Удаление префикса
strings.TrimSuffix("foo", "o") fo Удаление суффикса

Разделение по пробелам или запятым

Выражение Результат Описание
strings.Fields(" a\t b\n") ["a" "b"] Удаление пробелов
strings.Split("a,b", ",") ["a" "b"] Удаление разделителя
strings.SplitAfter("a,b", ",") ["a," "b"] Сохранение разделителя

Объединение строки с разделителем

Выражение Результат Описание
strings.Join([]string{"a", "b"}, ":") a:b Добавление разделителя
strings.Repeat("da", 2) dada 2 копии “da”

Форматирование и конвертирование

Выражение
Результат
Описание
strconv.Itoa(-42) "-42" Int к string
strconv.FormatInt(255, 16) "ff" Конвертирование к шестнадцетиричной основе

Sprintf

Функция fmt.Sprintf часто лучший выбор для форматирования данных:

s := fmt.Sprintf("%.4f", math.Pi) // s == "3.1416"


Читайте также:


Купить gopher

Комментариев нет:

Отправить комментарий