go语言获取输入 go语言输出hello word( 七 )


q:输出数值所表示的 Unicode 字符(带单引号) 。对于无法显示的字符,将输出其转义字符 。
U:输出 Unicode 码点(例如 U+1234,等同于字符串 "U+%04X" 的显示结果)
对于 o/x/X:
如果使用 "#" 旗标,则会添加前导 0 或 0x 。
对于 U:
如果使用 "#" 旗标,则会在 Unicode 码点后面添加相应的 '字符'(前提是该字符必须可显示)
[浮点型和复数型]
b:科学计数法(以 2为底)
e/E:科学计数法(以 10 为底,小写 e/大写 E)
f/F:普通小数格式(两者无区别)
g/G:大指数(指数 = 6)使用 %e/%E , 其它情况使用 %f/%F
[字符串或字节切片]
s:普通字符串
q:双引号引起来的 Go 语法字符串
x/X:十六进制编码(小写/大写 , 以字节为元素进行编码,而不是字符)
对于 q:
如果使用了 "+" 旗标,则将所有非 ASCII 字符都进行转义处理 。
如果使用了 "#" 旗标,则输出反引号引起来的字符串(前提是
字符串中不包含任何制表符以外的控制字符,否则忽略 # 旗标)
对于 x/X:
如果使用了 " " 旗标,则在每个元素之间添加空格 。
如果使用了 "#" 旗标,则在十六进制格式之前添加 0x 前缀 。
[指针类型]
p :带 0x 前缀的十六进制地址值 。
[符合类型]
复合类型将使用不同的格式输出,格式如下:
结 构 体:{字段1 字段2 ...}
数组或切片:[元素0 元素1 ...]
映 射:map[键1:值1 键2:值2 ...]
指向符合元素的指针:{}, [], map[]
复合类型本身没有动词 , 动词将应用到复合类型的元素上 。
结构体可以使用 "+v" 同时输出字段名 。
【注意】
1、如果 arg 是一个反射值,则该 arg 将被它所持有的具体值所取代 。
2、如果 arg 实现了 Formatter 接口,将调用它的 Format 方法完成格式化 。
3、如果 v 动词使用了 # 旗标(%#v),并且 arg 实现了 GoStringer 接口 , 将调用它的 GoString 方法完成格式化 。
如果格式化操作指定了字符串相关的动词(比如 %s、%q、%v、%x、%X) , 接下来的两条规则将适用:
4 。如果 arg 实现了 error 接口,将调用它的 Error 方法完成格式化 。
5 。如果 arg 实现了 string 接口 , 将调用它的 String 方法完成格式化 。
在实现格式化相关接口的时候,要避免无限递归的情况,比如:
type X string
func (x X) String() string {
return Sprintf("%s", x)
}
在格式化之前 , 要先转换数据类型,这样就可以避免无限递归:
func (x X) String() string {
return Sprintf("%s", string(x))
}
无限递归也可能发生在自引用数据类型上面 , 比如一个切片的元素引用了切片自身 。这种情况比较罕见,比如:
a := make([]interface{}, 1)
a[0] = a
fmt.Println(a)
【格式化输入】
// 格式化输入:从输入端读取字符串(以空白分隔的值的序列),
// 并解析为具体的值存入相应的 arg 中,arg 必须是变量地址 。
// 字符串中的连续空白视为单个空白,换行符根据不同情况处理 。
// \r\n 被当做 \n 处理 。
// 以动词 v 解析字符串,换行视为空白
Scan(arg列表)
// 以动词 v 解析字符串,换行结束解析
Scanln(arg列表)
// 根据格式字符串中指定的格式解析字符串
// 格式字符串中的换行符必须和输入端的换行符相匹配 。
Scanf(格式字符串, arg列表)
// Scan 类函数会返回已处理的 arg 数量和遇到的错误信息 。

推荐阅读