Чем отличаются обратные кавычки (``) от двойных кавычек ("") в Go?
Основные различия между обратными кавычками и двойными кавычками в Go
В Go существует два типа строковых литералов: интерпретируемые строки (в двойных кавычках) и сырые строки (в обратных кавычках). Их поведение кардинально отличается, и выбор зависит от конкретной задачи.
1. Обработка escape-последовательностей
Двойные кавычки поддерживают стандартные escape-последовательности, такие как:
\n— перевод строки\t— табуляция\\— обратный слеш\"— двойная кавычка\xNN— шестнадцатеричный код символа
Пример:
package main
import "fmt"
func main() {
// Интерпретируемая строка
a := "Привет,\nмир!\tTab"
fmt.Println(a)
// Вывод:
// Привет,
// мир! Tab
// Сырая строка — escape-последовательности не работают
b := `Привет,\nмир!\tTab`
fmt.Println(b)
// Вывод: Привет,\nмир!\tTab
}
2. Многострочность
Сырые строки могут занимать несколько строк в коде без использования конкатенации или символа \n. Это удобно для:
- JSON, XML, HTML-шаблонов
- Регулярных выражений
- SQL-запросов
- Любого текста с переносами
// Сырая строка — идеально для многострочного текста
jsonData := `{
"name": "Alice",
"age": 30,
"city": "New York"
}`
// Эквивалент с двойными кавычками (неудобно)
jsonData2 := "{\n \"name\": \"Alice\",\n \"age\": 30,\n \"city\": \"New York\"\n}"
3. Содержимое строки
В сырых строках нельзя использовать обратные кавычки — они завершают литерал. Если нужна обратная кавычка внутри строки, придётся использовать двойные кавычки или конкатенацию:
// Ошибка компиляции
// bad := `Обратная ` кавычка внутри`
// Решение — двойные кавычки
good := "Обратная ` кавычка внутри"
// Или конкатенация
good2 := `Часть строки` + "`" + `часть строки`
В двойных кавычках обратная кавычка не требует экранирования:
fmt.Println("Обратная ` кавычка") // Работает
4. Производительность
На этапе компиляции обе формы превращаются в одинаковые строки. Разницы в производительности нет. Выбор влияет только на читаемость кода и удобство написания.
5. Практические рекомендации
- Используйте обратные кавычки для:
- Многострочных строк (JSON, SQL, документация)
- Регулярных выражений (чтобы избежать экранирования обратных слешей)
- Строк с множеством обратных слешей (пути Windows, regex)
- Используйте двойные кавычки для:
- Коротких однострочных строк
- Строк, где нужны escape-последовательности (\n, \t)
- Строк, содержащих обратные кавычки
Полный пример сравнения
package main
import (
"fmt"
"regexp"
)
func main() {
// Путь Windows — с обратными кавычками проще
winPath := `C:\Users\Alice\Documents\file.txt`
// С двойными кавычками пришлось бы экранировать
// winPath2 := "C:\\Users\\Alice\\Documents\\file.txt"
// Регулярное выражение
re := regexp.MustCompile(`\d+\.\d+`) // Поиск чисел с плавающей точкой
// С двойными кавычками: "\\d+\\.\\d+" — ужасно читаемо
// HTML-шаблон
html := `<div class="container">
<h1>Title</h1>
</div>`
fmt.Println(winPath)
fmt.Println(re.MatchString("3.14")) // true
fmt.Println(html)
}
Запомните главное правило: обратные кавычки — для сырых данных без экранирования, двойные кавычки — для строк с управляющими символами.
<<Дополнение: Юникод и байтовые литералы
Есть ещё один важный нюанс, который часто упускают. В Go строки — это последовательности байтов, а не символов. Оба типа строковых литералов поддерживают UTF-8, но есть разница в интерпретации рун (rune literals).
Внутри двойных кавычек можно использовать рунные литералы — одиночные символы в одинарных кавычках, которые преобразуются в Unicode-код:
// Рунный литерал внутри строки
a := "Символ: 'A'" // Работает, но 'A' — это просто текст
b := "Символ: \u0041" // Unicode-escape — выведет 'A'
fmt.Println(b) // Символ: A
В обратных кавычках такое не работает — \u0041 будет выведено как текст. Если вам нужно вставить Unicode-символ по коду в сырой строке, придётся использовать конкатенацию:
// Не сработает
// raw := `\u0041`
// Правильный подход
raw := "A" + ` — это латинская буква A`
Также стоит помнить, что пустая строка может быть объявлена обоими способами:
empty1 := ""
empty2 := ``
// Оба варианта создают пустую строку длиной 0
На практике, если вам нужно написать строку, содержащую и обратные кавычки, и escape-последовательности, проще всего использовать двойные кавычки с экранированием или разбить строку на части. Но в 90% случаев выбор очевиден: сырые строки для "сырых" данных, интерпретируемые — для всего остального.
Ответов пока нет.
Войдите чтобы оставить ответ