fmt 实现了 printf 和 Scanf 的格式化 IO, 类似 c 语言。格式化 verb 来源于 c,但比 C 更简单。
printing 功能
verb
通用 :
%v 值的默认格式表示。当输出结构体时,扩展标志(%+v)会添加字段名
%#v 值的Go语法表示
%T 值的类型的Go语法表示
%% 百分号
布尔值 :
%t 单词true或false
整数 :
%b 表示为 二进制
%c 该值对应的 Unicode 码值
%d 表示为十进制
%o 表示为八进制
%q 该值对应的单引号括起来的go语法字符字面值,必要时会采用安全的转义表示
%x 表示为十六进制,使用a-f
%X 表示为十六进制,使用A-F
%U 表示为Unicode格式:U+1234,等价于”U+%04X”
浮点数 、复数 的两个组分:
%b 无小数部分、二进制指数的科学计数法,如-123456p-78;参见strconv.FormatFloat
%e 科学计数法,如-1234.456e+78
%E 科学计数法,如-1234.456E+78
%f 有小数部分但无指数部分,如123.456
%F 等价于%f
%g 根据实际情况采用%e或%f格式(以获得更简洁、准确的输出)
%G 根据实际情况采用%E或%F格式(以获得更简洁、准确的输出)
字符串 和[] byte :
%s 直接输出字符串或者[]byte
%q 该值对应的双引号括起来的go语法字符串字面值,必要时会采用安全的转义表示
%x 每个字节用两字符十六进制数表示(使用a-f)
%X 每个字节用两字符十六进制数表示(使用A-F)
指针 :
%p 表示为十六进制,并加上前导的0x
各种类型的 %v 默认的格式
bool: %t
int, int8 etc.: %d
uint, uint8 etc.: %d, %#x if printed with %#v
float32, complex64, etc: %g
string: %s
chan: %p
pointer: %p
对于合成对象,用以下规则打印元素
struct: {field0 field1 …}
array, slice: [elem0 elem1 …]
maps: map[key1:value1 key2:value2]
pointer to above: &{}, &[], &map[]
浮点精度 类似 c 语言
%f 默认宽度,默认精度
%9f 宽度9,默认精度
%.2f 默认宽度, 数度2
%9.2f 宽度9, 精度2
%9.f 宽度9, 精度0
其它 flag
+ 总是输出数值的正负号;对%q(%+q)会生成全部是ASCII字符的输出(通过转义);
– 在输出右边填充空白而不是默认的左边(即从默认的右对齐切换为左对齐);
# 切换格式:
八进制数前加0(%#o),十六进制数前加0x(%#x)或0X(%#X),指针去掉前面的0x(%#p);
对%q(%#q),如果strconv.CanBackquote返回真会输出反引号括起来的未转义字符串;
对%U(%#U),如果字符是可打印的,会在输出Unicode格式、空格、单引号括起来的go字面值;
‘ ‘ 对数值,正数前加空格而负数前加负号;
对字符串采用%x或%X时(% x或% X)会给各打印的字节之间加空格;
0 使用0而不是空格填充,对于数值类型会把填充的0放在正负号后面;
scanning 功能
一系列类似的函数可以扫描格式化文本以生成值。
Scan、Scanf和Scanln从标准输入os.Stdin读取文本;Fscan、Fscanf、Fscanln从指定的io.Reader接口读取文本;Sscan、Sscanf、Sscanln从一个参数字符串读取文本。
Scanln、Fscanln、Sscanln会在读取到换行时停止,并要求一次提供一行所有条目;Scanf、Fscanf、Sscanf只有在格式化文本末端有换行时会读取到换行为止;其他函数会将换行视为空白。
Scanf、Fscanf、Sscanf会根据格式字符串解析参数,类似Printf。例如%x会读取一个十六进制的整数,%v会按对应值的默认格式读取。格式规则类似Printf,有如下区别:
%p 未实现
%T 未实现
%e %E %f %F %g %G 效果相同,用于读取浮点数或复数类型
%s %v 用在字符串时会读取空白分隔的一个片段
flag # 和 + 未实现
index
type Stringer
type GoStringer
type State
type Formatter
type ScanState
type Scanner
func Printf(format string, a …interface{}) (n int, err error)
func Fprintf(w io.Writer, format string, a …interface{}) (n int, err error)
func Sprintf(format string, a …interface{}) string
func Print(a …interface{}) (n int, err error)
func Fprint(w io.Writer, a …interface{}) (n int, err error)
func Sprint(a …interface{}) string
func Println(a …interface{}) (n int, err error)
func Fprintln(w io.Writer, a …interface{}) (n int, err error)
func Sprintln(a …interface{}) string
func Errorf(format string, a …interface{}) error
func Scanf(format string, a …interface{}) (n int, err error)
func Fscanf(r io.Reader, format string, a …interface{}) (n int, err error)
func Sscanf(str string, format string, a …interface{}) (n int, err error)
func Scan(a …interface{}) (n int, err error)
func Fscan(r io.Reader, a …interface{}) (n int, err error)
func Sscan(str string, a …interface{}) (n int, err error)
func Scanln(a …interface{}) (n int, err error)
func Fscanln(r io.Reader, a …interface{}) (n int, err error)
func Sscanln(str string, a …interface{}) (n int, err error)
#### [参考文章](