понедельник, 20 мая 2019 г.

Спецификация Go: строковые литералы

Строковые литералы (String literals)

Строковый литерал представляет собой строковую константу, полученную в результате объединения последовательности символов. Существует две формы: необработанные строковые литералы (raw string literals) и интерпретируемые строковые литералы (interpreted string literals).

Необработанные строковые литералы - это символьные последовательности между обратными кавычками, как в `foo`. В кавычках может появляться любой символ, кроме обратной кавычки. Значение необработанного строкового литерала - это строка, состоящая из неинтерпретированных (неявно кодированных в UTF-8) символов между кавычками; в частности, обратная косая черта не имеет специального значения, и строка может содержать символы новой строки. Символы возврата каретки ('\r') внутри необработанных строковых литералов отбрасываются из необработанного строкового значения.

Интерпретируемые строковые литералы являются символьными последовательностями между двойными кавычками, как в "bar". В кавычках может появляться любой символ, кроме символа новой строки (newline) и неэкранированной двойной кавычки. Текст между кавычками формирует значение литерала, с экранированием обратной косой черты, интерпретируемым так же как в литералах рун (за исключением того, что \' недопустимо, а \" является законным), с теми же ограничениями. Трехзначный восьмеричный (\nnn) и двузначные шестнадцатеричные (\xnn) escape-символы представляют отдельные байты результирующей строки, все другие escape-последовательности представляют (возможно, многобайтовую) кодировку UTF-8 отдельных символов. Таким образом, внутри строкового литерала \377 и \xFF представляют один байт значения 0xFF = 255, тогда как ÿ, \u00FF, \U000000FF и \xc3\xbf представляют два байта 0xc3 0xbf кодировки UTF-8 символа U+00FF (символ ÿ).

string_lit             = raw_string_lit | interpreted_string_lit .
raw_string_lit         = "`" { unicode_char | newline } "`" .
interpreted_string_lit = `"` { unicode_value | byte_value } `"` .

Примеры:

`abc`                // то же самое что и "abc"
`\n
\n`                  // то же самое что и "\\n\n\\n"
"\n"
"\""                 // то же самое что и `"`
"Hello, world!\n"
"日本語"
"\u65e5本\U00008a9e"
"\xff\u00FF"
"\uD800"             // недопустимо: суррогатная половина (surrogate half)
"\U00110000"         // недопустимо: невалидная Unicode кодовая точка

Следующие примеры представляют одну и ту же строку:

"日本語"                                 // UTF-8 текст ввода
`日本語`                                 // UTF-8 текст ввода как необработанный литерал
"\u65e5\u672c\u8a9e"                    // явные Unicode кодовые точки
"\U000065e5\U0000672c\U00008a9e"        // явные Unicode кодовые точки
"\xe6\x97\xa5\xe6\x9c\xac\xe8\xaa\x9e"  // явные UTF-8 байты

Если исходный код представляет символ в виде двух кодовых точек, таких как комбинированная форма с акцентом и буквой, результатом будет ошибка, если он помещен в литерал руны (это не одна кодовая точка), и будет отображаться как две кодовые точки, если они помещены в строковый литерал.


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


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

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