我是新手.刚刚学会fmt.Println()的各种用法.我try 了以下方法,但得到了意想不到的结果.请解释我在理解上哪里出了错.

input: fmt.Println("hi\b", "there!")
output: hi� there!
expected: h there!

input: fmt.Println("hi", '\b', "there!")
output: hi 8 there!
expected: hithere!... assuming runes are not appended with spaces

input: fmt.Println("hi", "\bthere!")
output: hi �there!
expected: hithere!


(注意:上面的占位符字符已被U+FFFD替换,因为原始字符在不同环境中的渲染不一致.)

推荐答案

你的程序输出的正是你告诉它的内容.问题主要在于输出查看器.

控制字符和序列只有在发送到兼容的虚拟控制台(或物理终端,或打印机或电传 typewriter ;但后者现在非常罕见)时才会产生预期效果.Go Playerly所做的是按原样捕获程序的输出,并将其未经修改地发送到浏览器以显示.浏览器不解释终端控制代码(除了换行符,甚至有时也不解释);相反,它希望通过HTML标记传递格式.由于退格字符没有指定的标志符号,浏览器通常会显示一个占位符标志符号,有时甚至什么都不显示.

如果在本地机器上运行Go程序时,将其输出重定向到文本文件,然后在文本编辑器中打开该文件,则会得到类似的效果:编辑器不会解释文本文件中包含的任何转义序列;有时,它甚至会通过替换字符的符号、常规表示(如^H)来主动阻止显示编辑器的终端(如果它恰好是基于控制台的编辑器)解释控制字符.

在中间示例中,'\b'个文字计算为具有字符的Unicode代码点数的整数(什么是术语"符文").这是explained in the specification:

符文文本表示符文常量,即标识Unicode代码点的整数值.符文文字表示为一个或多个用单引号括起来的字符,如'x''\n'.在引号中,除换行符和未换行的单引号外,任何字符都可以出现.单引号字符表示字符本身的Unicode值,而以反斜杠开头的多字符序列以各种格式对值进行编码.

因为'\b'代表U+0008,所以传递给fmt.Println的是整数值8.然后,该函数将整数打印为十进制表示,而不是将其解释为字符代码.

Go相关问答推荐

T的Golang通用切片,其中 *T实现接口

如何使用Docker Compose配置Go,使main. go文件位于/CMD文件夹中

使用GO从RDPMC获得价值

为什么Slices包中的函数定义Slice参数的类型参数?

可以';t从主机连接到ScyllaDB容器

如何模拟go的Elastic search SDK?

在运行时更改 Go lang slog 的日志(log)级别

如何在正则表达式中使整个单词可选?

最长连续重复的字符golang

Golang 网络应用程序安全性:您是否应该判断输入是否为有效的 utf-8?

无法将 graphql-ws 连接到 gqlgen

是否可以从 golang 中的参数推断类型?

当图像是对象数组的元素时,如何显示存储为页面资源的图像?

如何在切片增长时自动将切片的新元素添加到函数参数

仅在工作日运行 cron

go 是否对 struct 使用空间填充之类的东西?

函数调用中的类型参数panic

Go AST:获取所有 struct

Golang Echo Labstack 如何在模板视图中调用函数/方法

如何排除溢出矩阵的坐标