在 fmt 包,有关格式化输入输出的方法就两大类:Scan 和 Print ,分别在scan.go 和 print.go 文件中。
fmt
Scan
Print
print.go文件中定义了如下函数 :
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
这9个函数,按照两个维度来说明,基本上可以说明白了。
f
ln
Println、Fprintln、Sprintln 输出内容时会加上换行符; Print、Fprint、Sprint 输出内容时不加上换行符; Printf、Fprintf、Sprintf 按照指定格式化文本输出内容。
F
S
io.Writer
Print、Printf、Println 输出内容到标准输出os.Stdout; Fprint、Fprintf、Fprintln 输出内容到指定的io.Writer; Sprint、Sprintf、Sprintln 输出内容到字符串。
scan.go文件中定义了如下函数:
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)
这9个函数可以扫描格式化文本以生成值。同样也可以按照两个维度来说明。
Scanln、Fscanln、Sscanln 读取到换行时停止,并要求一次提供一行所有条目; Scan、Fscan、Sscan 读取内容时不关注换行; Scanf、Fscanf、Sscanf 根据格式化文本读取。
io.Reader
Scan、Scanf、Scanln 从标准输入os.Stdin读取文本; Fscan、Fscanf、Fscanln 从指定的io.Reader接口读取文本; Sscan、Sscanf、Sscanln 从一个参数字符串读取文本。
type Person struct { Name string } func main() { person := Person{Name: "亚索"} fmt.Printf("%v", person) //{亚索} fmt.Printf("%+v", person) //{Name:亚索} fmt.Printf("%#v", person) //main.Person{Name:"亚索"} fmt.Printf("%T", person) //main.Person fmt.Printf("%%") //% }
func main() { fmt.Printf("%t", true) // true fmt.Printf("%t", false) //false }
func main() { fmt.Printf("%b", 5) // 101 fmt.Printf("%c", 0x4E2d) // 中 fmt.Printf("%d", 0x12) // 18 fmt.Printf("%o", 10) // 12 fmt.Printf("%q", 0x4E2d) // '中' fmt.Printf("%x", 13) // d fmt.Printf("%X", 13) // D fmt.Printf("%U", 0x4E2d) // U+4E2D }
func main() { fmt.Printf("%b", 10.20) // 5742089524897382p-49 fmt.Printf("%e", 10.20) // 1.020000e+01 fmt.Printf("%E", 10.20) // 1.020000E+01 fmt.Printf("%f", 10.20) // 10.200000 fmt.Printf("%F", 10.20) // 10.200000 fmt.Printf("%g", 10.20) // 10.2 fmt.Printf("%G", 10.20) // 10.2 }
func main() { fmt.Printf("%s", []byte("Go语言")) // Go语言 fmt.Printf("%q", "Go语言") // "Go语言" fmt.Printf("%x", "golang") // 676f6c616e67 fmt.Printf("%X", "golang") // 676F6C616E67 }
type Person struct { Name string } func main() { person := Person{Name: "瑞雯"} fmt.Printf("%p",&person) // 0xc0000881e0 }
verb会忽略不支持的旗标(flag)
type Person struct { Name string } func main() { person := Person{Name: "菲奥娜"} fmt.Printf("%+q", "中文") // "\u4e2d\u6587" fmt.Printf("%#o", 46) // 056 fmt.Printf("%#x", 46) // 0x2e fmt.Printf("%#p", &person) // c0000481f0 fmt.Printf("%#q", '中') // '中' fmt.Printf("%#U", '中') // U+4E2D '中' fmt.Printf("% d", 16) // 16 fmt.Printf("% x","abc") // 61 62 63 }
默认的 %f 输出格式是小数点后要有6位有效数字,不够补后置零
%f
func main() { fmt.Printf("%f\n", 0.31415926) // 0.314159 fmt.Printf("%f\n", 3.1415926) // 3.141593 fmt.Printf("%f\n", 314.15926) // 314.159260 fmt.Printf("%f\n", 3141.5926) // 3141.592600 fmt.Printf("%f\n", 3141.) // 3141.000000 }
Go语言中对宽度和有效数字的限定:%[宽度].[精度]f
%[宽度].[精度]f
整数位数+小数位数 + 1(小数点算一位)
func main() { fmt.Printf("%3.3f\n", 314.15926) // 314.159 fmt.Printf("%8.3f\n", 314.15926) // 314.159 fmt.Printf("%8.f\n", 314.15926) // 314 fmt.Printf("%4.0f\n", 314.15926) // 314 fmt.Printf("%4.6f\n", 314.15926) // 314.159260 }
对于整数 %d,宽度和精度都表示整数数字个数,只是在指定宽度超过实际宽度时,指定精度会补前置零,指定宽度会按照实际宽度输出
%d
func main() { fmt.Printf("%d\n", 12345) // 12345 fmt.Printf("%3d\n", 12345) // 12345 fmt.Printf("%.3d\n", 12345) // 12345 fmt.Printf("%3.3d\n", 12345) // 12345 fmt.Printf("%6d\n", 12345) // 12345 fmt.Printf("%.6d\n", 12345) // 012345 fmt.Printf("%6.6d\n", 12345) // 012345 fmt.Printf("%8.7d\n", 12345) // 0012345 }
>
指定精度会至少要显示出这么多宽度的数字,所以不足时补零到足够为止,这时候,如果指定的宽度大于精度,那么剩余的填充符就不一定是0了,要看实际设定是什么,默认是左边补空格
对于 %e、%g这些,类似,遇到百度。
%e
%g
原文链接:https://e-thunder.blog.csdn.net/article/details/106833707?spm=1001.2101.3001.6650.1&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-1.no_search_link&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-1.no_search_link