Golang 格式化输出靠 fmt
库。
方法
(f|s)?(scan|print)(f|ln)?
一组合就有 18 个方法了,再加上一个 Errorf
。
func Errorf(format string, a ...interface{}) error
func Fprint(w io.Writer, a ...interface{}) (n int, err error)
func Fprintf(w io.Writer, format string, a ...interface{}) (n int, err error)
func Fprintln(w io.Writer, a ...interface{}) (n int, err error)
func Fscan(r io.Reader, a ...interface{}) (n int, err error)
func Fscanf(r io.Reader, format string, a ...interface{}) (n int, err error)
func Fscanln(r io.Reader, a ...interface{}) (n int, err error)
func Print(a ...interface{}) (n int, err error)
func Printf(format string, a ...interface{}) (n int, err error)
func Println(a ...interface{}) (n int, err error)
func Scan(a ...interface{}) (n int, err error)
func Scanf(format string, a ...interface{}) (n int, err error)
func Scanln(a ...interface{}) (n int, err error)
func Sprint(a ...interface{}) string
func Sprintf(format string, a ...interface{}) string
func Sprintln(a ...interface{}) string
func Sscan(str string, a ...interface{}) (n int, err error)
func Sscanf(str string, format string, a ...interface{}) (n int, err error)
func Sscanln(str string, a ...interface{}) (n int, err error)
type Formatter
type GoStringer
type ScanState
type Scanner
type State
type Stringer
后缀:f,ln
- f 表示格式化
- ln 表示换行
另外 ln 会在参数之间添加空格,而默认只会在都不是字符串的参数之间添加空格。
Fprint,Sprint,Print 之间的区别
Print
输出到标准输出(如果相连两个参数都不是字符串,会自动添加空格)Sprint
返回字符串Fprint
输出到指定输出流(io.Writer
类型)
package main
import (
"fmt"
"io"
"os"
)
func main() {
const name, age = "Kim", 22
fmt.Print(name, " is ", age, age, " years old.\n")
s := fmt.Sprint(name, " is ", age, age, " years old.\n")
io.WriteString(os.Stdout, s) // Ignoring error for simplicity.
}
// Kim is 22 22 years old.
// Kim is 22 22 years old.
占位符
%v # 值
%+v # 对于 struct,可以显示字段名称
%#v # 值(Go 语法)
%T # 值的类型(Go 语法)
%%
# Boolean
%t # true, false
# Integer: dbox cu
%d # base10 dec,decimal ['desɪml]
%b # base2 bin,binary ['baɪnəri]
%o # base8 oct,octal ['ɒktl]
%O # base8 with 0o prefix
%x # base16 hex,hexadecimal [ˌheksə'desɪml]
%X # base16 uppercase
%c # Unicode Character
%U # U+%04X
# Float: befg
%b # 一种少见的计数法
# 例如:-123456p-78,表示 -(123456 / (2^78)) = -1624.421052631579
%e # 自然计数法,欧拉数
%E # 自然计数法 (大写 E)
%f # 传统的小数表示
%F # 等于 %f
%g # 自动 %e, %f
%G # 自动 %E, %F
# String OR SliceOfBytes:
%s
%q # Go 语法转义, 双引号
%x # base16
%X # base16 uppercase
# Pointer
# Slice 0 号元素的位置
%p # 0x 开头,十六进制
# 对指针也可以使用 b d o x 代表的各种进制。
# 前缀
+ # 打印数值的正负号
- # 左对齐(右侧填充)
0 # 使用 0 填充
# 空格前缀
% d # 为正负号留出空格
% x / % X # 字节之间加空格
# 井号前缀
%#o # 带前导 0 的八进制
%#x / %#X # 带前导 0x 的十六进制
%#p # 不带前导 0x 的十六进制
%#q # Go 语法转义,反引号
%#U # Unicode 编码之后再加改字符
宽度
%f default width, default precision
%9f width 9, default precision
%.2f default width, precision 2
%9.2f width 9, precision 2
%9.f width 9, precision 0
占位符 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[]
示例