Go语言中如何实现字符串变量的非转义获取与输出?
如何在Go中输出字符串变量的原始转义字符?
嘿,这个问题我之前在写Go代码的时候也踩过坑!当你用双引号定义字符串"abc\tdef"并存在变量里时,Go其实已经把\t解析成了制表符,直接用fmt.Println输出自然会显示成空格。想要把变量里的字符串以原始转义形式输出,有两个实用的办法:
方法一:使用strconv包的Quote系列函数
Go标准库的strconv包提供了QuoteToASCII和Quote函数,能把字符串转换成带双引号的原始转义格式,我们只需要去掉首尾的引号就能得到想要的结果:
package main import ( "fmt" "strconv" ) func main() { s := "abc\tdef" // 获取带双引号的转义字符串,比如会返回 "\"abc\\tdef\"" quotedStr := strconv.QuoteToASCII(s) // 切片去掉首尾的双引号 rawEscapeStr := quotedStr[1 : len(quotedStr)-1] fmt.Println(rawEscapeStr) // 输出:abc\tdef }
QuoteToASCII会把所有非ASCII字符和转义序列都转换成对应的ASCII转义形式,完全符合我们要的“非转义输出”需求;如果不需要处理非ASCII字符,用strconv.Quote也可以。
方法二:手动遍历替换特殊字符
如果需要更灵活的控制(比如只处理特定的转义字符),可以自己遍历字符串,把特殊字符替换成对应的转义字符串:
package main import ( "fmt" "strings" ) // 自定义转义函数,处理常见的特殊字符 func escapeRawStr(s string) string { var sb strings.Builder for _, char := range s { switch char { case '\t': sb.WriteString(`\t`) case '\n': sb.WriteString(`\n`) case '\r': sb.WriteString(`\r`) case '"': sb.WriteString(`\"`) case '\\': sb.WriteString(`\\`) // 可以根据需要添加更多特殊字符的处理 default: sb.WriteRune(char) } } return sb.String() } func main() { s := "abc\tdef" fmt.Println(escapeRawStr(s)) // 输出:abc\tdef }
这个方法的优势是可以自定义要处理的转义字符,避免处理不需要的内容,但需要自己维护所有要替换的特殊字符列表。
小提示
如果是还未定义变量的场景,直接用反引号`abc\tdef`定义字符串变量,就能直接得到不被Go解析的原始内容,后续直接输出即可,不需要额外处理~
内容的提问来源于stack exchange,提问作者Cloud
相关产品推荐
相关产品推荐

