Строки и runes
Тема дорожной карты · Golang
Строки в Go — неизменяемые последовательности байт (не символов), кодируемые как UTF-8 по соглашению; встроенный тип string отличается от []byte, хотя оба можно свободно конвертировать друг в друга. Пакет strings предоставляет полный набор строковых операций: strings.Contains, strings.HasPrefix, strings.HasSuffix, strings.TrimSpace, strings.Split, strings.Join, strings.Replace, strings.ToLower и strings.Builder для эффективного инкрементального построения строк без повторных выделений памяти. Поскольку строки Go неизменяемы, конкатенация множества строк в цикле должна использовать strings.Builder или bytes.Buffer, а не оператор +, во избежание O(n²)-поведения при выделении памяти. Пакет unicode/utf8 предоставляет операции на уровне рун (кодовых точек) — utf8.RuneCountInString, utf8.DecodeRuneInString — для корректной обработки многобайтовых символов в интернационализированных Golang-сервисах. Форматирование строк использует fmt.Sprintf с printf-стиль глаголами (%s, %d, %v, %+v, %T) и является стандартным способом построения сообщений журнала, строк ошибок и HTTP-ответов в Go-программах.
Как это работает
Строки и runes намеренно мал: ключевые слова (var, const, if, for, switch, defer, go, select, return, type, func, package, import), нет классов (struct + методы + интерфейсы), нет исключений (multi-return + error-значения), нет наследования (композиция через embedding). Видимость по регистру: с заглавной — экспорт, со строчной — package-private. := объявляет + присваивает; = — присваивает. defer выполняется при возврате функции — идеально для cleanup. Компилятор не пропустит неиспользуемые импорты + переменные.
Когда применять
Примите минимализм — Go дерётся с попытками умничать. gofmt (без флагов, канонический стиль); коммитьте только отформатированный код. defer — для cleanup в паре с захватом (defer f.Close() сразу после f, err := os.Open(...)). Короткое объявление (:=) внутри функций; var — для zero-valued объявлений или когда нужен конкретный тип.
Типичные ошибки
Ловушки Строки и runes: for i := range slice и получение и индекса и копии, когда хотели оба (for i, v := range slice); shadow внешних переменных через := ("почему внешняя переменная не изменилась?"); не обрабатывают ошибку немедленно (_, _ = ... игнорирует); глобальное состояние — Go-программы становятся сложными для понимания при shared mutable state.