Что означает «безопасно избежать с помощью синтаксиса Go»? - PullRequest
0 голосов
/ 09 мая 2019

Пакет Go's fmt определяет %q (для строк) как:

 %q      a double-quoted string safely escaped with Go syntax

Что означает , безопасно сбежавший с синтаксисом Go означает?

Некоторые эксперименты показывают, что он сохраняет escape-последовательности, используемые в исходной строке:

s := "This has \"quotes\" in it"
fmt.Printf("%q\n", s)             // output: "This has \"quotes\" in it"

Есть ли что-нибудь еще, что он делает? В каких ситуациях вы можете использовать это? Я предполагаю, возможно, в шаблонах, которые генерируют код Go?

Ответы [ 2 ]

4 голосов
/ 09 мая 2019

Это означает, что отформатированный вывод будет должным образом экранирован, что его можно будет скопировать и использовать в исходном коде go

Пример форматирования

 "abc"          => `"abc"`
 []byte("abc")  => `"abc"`
 ""             => `""`
 "\""           => `"\""`
 `\n`           => `"\\n"`
 renamedBytes([]byte("hello")) => `"hello"`
 []renamedUint8{'h', 'e', 'l', 'l', 'o'} => `"hello"`
 reflect.ValueOf("hello") => `"hello"`

Код, объясняющий выше

package main

import (
    "fmt"
    "reflect"
)

func main() {
    type renamedBytes []byte
    type renamedUint8 uint8

    fmt.Printf("%q\n", "abc")
    fmt.Printf("%q\n", []byte("abc"))
    fmt.Printf("%q\n", "\n")
    fmt.Printf("%q\n", []renamedUint8{'h', 'e', 'l', 'l', 'o'})
    fmt.Printf("%q\n", renamedBytes([]byte("hello")))
    fmt.Printf("%q\n", reflect.ValueOf("hello"))
}
0 голосов
/ 09 мая 2019

это преобразует странный / неправильно сформированный ввод во что-то, что безопасно использовать

это изменит строковое представление этого байтового массива [] byte {56, 21, 114, 215, 252, 199, 62, 146, 143, 167, 197, 162, 172, 158, 112, 4, 76, 17, 222, 32, 34, 215, 199, 97, 187, 143, 61, 161, 211, 96, 198, 218, 134, 106, 85, 107, 162, 194, 36, 153, 255} из "o <�i���H���O��Ia) eb�? G (V���H" в ")\ x9d \ xd8 ջ \ x90 \ xf13 \ x89 \ xd6 \ xd0 \ v2 \ xc0 \ xbe.m \ хаа! B \ XBF \ XBE \ xe7s \ x0e \ XFF \ XAC \ xf4Ӕ \ xe6Dx \ x88 \ xd3c \ xa2P \ x16n\ x97 \ xc8 "</p>

, но" hello world "останется" hello world "

, если массив байтов будет принтером прямо в ваш терминал, это может сделать ваш терминал странным, например мой терминалвернул это "" D␊␌⎼≤⎻├␊␍ ⎽├⎼␋┼ ± "H␊┌┌⎺, ┬⎺⎼┌␍!", когда я использовал string () вместо "% q"

...