《Go语言四十二章经》第三十二章 fmt包
上一章我们有提到fmt格式化I/O,这一章我们就详细来说说。在fmt包,有关格式化输入输出的方法就两大类:Scan 和 Print ,分别在scan.go 和 print.go 文件中。
print.go文件中定义了如下函数:
这9个函数,按照两个维度来说明,基本上可以说明白了。当然这两个维度是我个人为了记忆而分,并不是官方的说法。
一:如果把”Print”理解为核心关键字,那么后面跟的后缀有”f”和”ln”以及””,着重的是内容输出的结果;
如果后缀是”f”, 则指定了format
如果后缀是”ln”, 则有换行符
Print、Fprint、Sprint 输出内容时不加上换行符;
Printf、Fprintf、Sprintf 按照指定格式化文本输出内容。
如果前缀是”F”, 则指定了io.Writer
如果前缀是”S”, 则是输出到字符串
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个函数可以扫描格式化文本以生成值。同样也可以按照两个维度来说明。
一:如果把”Scan”理解为核心关键字,那么后面跟的后缀有”f”和”ln”以及””,着重的是输入内容的结果;
如果后缀是”f”, 则指定了format
如果后缀是”ln”, 则有换行符
如果前缀是”F”, 则指定了io.Reader
如果前缀是”S”, 则是从字符串读取
Scan、Scanf、Scanln 从标准输入os.Stdin读取文本;
Fscan、Fscanf、Fscanln 从指定的io.Reader接口读取文本;
Sscan、Sscanf、Sscanln 从一个参数字符串读取文本。
32.2 格式化verb应用
在应用上,我们主要讲讲格式化verb ,fmt包中格式化的主要功能函数都在format.go文件中。
我们先来了解下有哪些verb:
verb会忽略不支持的flag。
下面我们用一个程序来演示下:
package main
import (
"fmt"
"os"
)
type User struct {
name string
age int
}
var valF float64 = 32.9983
var valS string = "Go is an open source programming language that makes it easy to build simple, reliable, and efficient software."
var valB bool = true
func main() {
p := User{"John", 28}
fmt.Printf("Printf struct %%v : %v\n", p)
fmt.Printf("Printf struct %%+v : %+v\n", p)
fmt.Printf("Printf struct %%#v : %#v\n", p)
fmt.Printf("Printf struct %%T : %T\n", p)
fmt.Printf("Printf struct %%p : %p\n", &p)
fmt.Printf("Printf float64 %%v : %v\n", valF)
fmt.Printf("Printf float64 %%+v : %+v\n", valF)
fmt.Printf("Printf float64 %%#v : %#v\n", valF)
fmt.Printf("Printf float64 %%T : %T\n", valF)
fmt.Printf("Printf float64 %%f : %f\n", valF)
fmt.Printf("Printf float64 %%4.3f : %4.3f\n", valF)
fmt.Printf("Printf float64 %%8.3f : %8.3f\n", valF)
fmt.Printf("Printf float64 %%-8.3f : %-8.3f\n", valF)
fmt.Printf("Printf float64 %%e : %e\n", valF)
fmt.Printf("Printf float64 %%E : %E\n", valF)
fmt.Printf("Printf int %%v : %v\n", valI)
fmt.Printf("Printf int %%+v : %+v\n", valI)
fmt.Printf("Printf int %%#v : %#v\n", valI)
fmt.Printf("Printf int %%8d : %8d\n", valI)
fmt.Printf("Printf int %%-8d : %-8d\n", valI)
fmt.Printf("Printf int %%b : %b\n", valI)
fmt.Printf("Printf int %%c : %c\n", valI)
fmt.Printf("Printf int %%o : %o\n", valI)
fmt.Printf("Printf int %%U : %U\n", valI)
fmt.Printf("Printf int %%q : %q\n", valI)
fmt.Printf("Printf int %%x : %x\n", valI)
fmt.Printf("Printf string %%v : %v\n", valS)
fmt.Printf("Printf string %%+v : %+v\n", valS)
fmt.Printf("Printf string %%#v : %#v\n", valS)
fmt.Printf("Printf string %%T : %T\n", valS)
fmt.Printf("Printf string %%x : %x\n", valS)
fmt.Printf("Printf string %%X : %X\n", valS)
fmt.Printf("Printf string %%s : %s\n", valS)
fmt.Printf("Printf string %%200s : %200s\n", valS)
fmt.Printf("Printf string %%-200s : %-200s\n", valS)
fmt.Printf("Printf string %%q : %q\n", valS)
fmt.Printf("Printf bool %%v : %v\n", valB)
fmt.Printf("Printf bool %%+v : %+v\n", valB)
fmt.Printf("Printf bool %%#v : %#v\n", valB)
fmt.Printf("Printf bool %%T : %T\n", valB)
fmt.Printf("Printf bool %%t : %t\n", valB)
s := fmt.Sprintf("a %s", "string")
fmt.Println(s)
}