共计 3621 个字符,预计需要花费 10 分钟才能阅读完成。
Println 输入
Print 系列函数会将内容输入到零碎的规范输入,区别在于 Print 函数间接输入内容,Printf 函数反对格式化输入字符串,Println 函数会在输入内容的结尾增加一个换行符。
fmt.Println("Println 输入,尾部会有换行符")
print("print 输入")
Fprint
Fprint 系列函数会将内容输入到一个 io.Writer 接口类型的变量 w 中,咱们通常用这个函数往文件中写入内容。
实例:
// 向规范输入写入内容
fmt.Fprintln(os.Stdout, "向规范输入写入内容")
fileObj, err := os.OpenFile("./test.txt", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0644)
if err != nil {fmt.Println("关上文件出错,err:", err)
return
}
name := "叫我詹躲躲"
// 向关上的文件句柄中写入内容
fmt.Fprintf(fileObj, "往文件中写如信息:%s", name)
// 只有满足 io.Writer 接口的类型都反对写入。
Sprint
Sprint 系列函数会把传入的数据生成并返回一个字符串。
实例:
a:=fmt.Sprint("叫我詹躲躲")
fmt.Println(a) // 叫我詹躲躲
fmt.Sprint("我是 %s",a) // 叫我詹躲躲
Errorf
Errorf 函数依据 format 参数生成格式化字符串并返回一个蕴含该字符串的谬误。
通常应用这种形式来自定义谬误类型。
fmt.Errorf("这是一个报错信息!")
fmt.Errorf 函数新加了一个 %w 占位符用来生成一个能够包裹 Error 的 Wrapping Error。err:=errors.News("报错信息")
w:=fmt.Errorf("包裹 wrap %w",err)
printf
反对各种占位符。
占位符 | 阐明 |
---|---|
% | 是字符串运算符,被称为格式化操作符。 |
%v | 值的默认格局示意 |
%+v | 相似 %v,但输入构造体时会增加字段名 |
%#v | 值的 Go 语法示意 |
%t | 布尔值 |
%T | 打印值的类型 |
%% | 百分号 |
%b | 二进制示意 |
%c | 相应 Unicode 码点所示意的字符 |
%d | 十进制示意 |
%o | 八进制示意 |
%q | 单引号围绕的字符字面值,由 Go 语法平安地本义 |
%x | 十六进制示意,字母模式为小写 a-f |
%X | 十六进制示意,字母模式为大写 A-F |
%U | Unicode 格局:U+1234,等同于 “U+%04X” |
%s | 字符串或切片的无解译字节 |
%q | 双引号围绕的字符串,由 Go 语法平安地本义 |
%x | 十六进制,小写字母,每字节两个字符 |
%X | 十六进制,大写字母,每字节两个字符 |
%p | 十六进制示意,前缀 0x |
默认格局
类型 | 占位符 | |
---|---|---|
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 |
+ 总打印数值的正负号;对于 %q(%+q)保障只输入 ASCII 编码的字符。
- 左对齐
备用格局:为八进制增加前导 0(%#o),为十六进制增加前导 0x(%#x)或 0X(%#X),为 %p(%#p)去掉前导 0x;对于 %q,若 strconv.CanBackquote 返回 true,就会打印原始(即反引号围绕的)字符串;如果是可打印字符,%U(%#U)会写出该字符的 Unicode 编码模式(如字符 x 会被打印成 U+0078 ‘x’)。
‘ ‘(空格)为数值中省略的正负号留出空白(% d);以十六进制(% x, % X)打印字符串或切片时,在字节之间用空格隔开
0 填充前导的 0 而非空格;对于数字,这会将填充移到正负号之后
p := point{1, 2}
fmt.Printf("%v\n", p) //{1,2}
fmt.Printf("%+v\n", p) //{x:1 y:2}
fmt.Printf("%#v\n", p) //main.point{x:1, y:2}
fmt.Printf("%T\n", p) // main.point
fmt.Printf("%t\n", true) //true
fmt.Printf("%d\n", 123) //123
fmt.Printf("%b\n", 14) //1110
fmt.Printf("%c\n", 33) //!
fmt.Printf("%x\n", 456) //1c8
fmt.Printf("%f\n", 78.9) //78.900000
fmt.Printf("%e\n", 123400000.0) //1.234000e+08
fmt.Printf("%E\n", 123400000.0) //1.234000E+08
fmt.Printf("%s\n", "\"string\"") //"string"fmt.Printf("%q\n","\"string\"")//"\"string\""fmt.Printf("%x\n","hex this") //6865782074686973
fmt.Printf("%p\n", &p) //0xc0000b4010
fmt.Printf("|%6d|%6d|\n", 12, 345) //| 12| 345|
fmt.Printf("|%6.2f|%6.2f|\n", 1.2, 3.45) //| 1.20| 3.45|
fmt.Printf("|%-6.2f|%-6.2f|\n", 1.2, 3.45) //|1.20 |3.45 |
fmt.Printf("|%6s|%6s|\n", "foo", "b") //| foo| b|
fmt.Printf("|%-6s|%-6s|\n", "foo", "b") //|foo |b |
s := fmt.Sprintf("a %s", "string")
fmt.Println(s) //a string
fmt.Fprintf(os.Stderr, "an %s\n", "error")//an error
宽度标识符
宽度通过一个紧跟在百分号前面的十进制数指定,如果未指定宽度,则示意值时除必须之外不作填充。精度通过(可选的)宽度后跟点号后跟的十进制数指定。如果未指定精度,会应用默认精度;如果点号后没有跟数字,示意精度为 0。
占位符 阐明
%f 默认宽度,默认精度
%9f 宽度 9,默认精度
%.2f 默认宽度,精度 2
%9.2f 宽度 9,精度 2
%9.f 宽度 9,精度 0
获取输入
Go 语言 fmt 包下有 fmt.Scan、fmt.Scanf、fmt.Scanln 三个函数,能够在程序运行过程中从规范输出获取用户的输出。
fmt.Scan
Scan 从规范输出扫描文本,读取由空白符分隔的值保留到传递给本函数的参数中,换行符视为空白符。本函数返回胜利扫描的数据个数和遇到的任何谬误。如果读取的数据个数比提供的参数少,会返回一个错误报告起因。
fmt.Scan 从规范输出中扫描用户输出的数据,将以空白符分隔的数据别离存入指定的参数。
fmt.Scanf
Scanf 从规范输出扫描文本,依据 format 参数指定的格局去读取由空白符分隔的值保留到传递给本函数的参数中。本函数返回胜利扫描的数据个数和遇到的任何谬误。
fmt.Scanf 不同于 fmt.Scan 简略的以空格作为输出数据的分隔符,fmt.Scanf 为输出数据指定了具体的输出内容格局,只有依照格局输出数据才会被扫描并存入对应变量。
fmt.Scanln
Scanln 相似 Scan,它在遇到换行时才进行扫描。最初一个数据前面必须有换行或者达到完结地位。本函数返回胜利扫描的数据个数和遇到的任何谬误。
fmt.Scanln 遇到回车就完结扫描了,这个比拟罕用
几种输出形式的区别
输入形式 | 区别 |
---|---|
Scan、Scanf 和 Scanln | 从 os.Stdin 中读取; |
Fscan、Fscanf 和 Fscanln | 从指定的 io.Reader 中读取; |
Sscan、Sscanf 和 Sscanln | 从实参字符串中读取。 |
Scanln、Fscanln 和 Sscanln | 在换行符处进行扫描,且须要条目紧随换行符之后; |
Scanf、Fscanf 和 Sscanf | 须要输出换行符来匹配格局中的换行符;其它函数则将换行符视为空格。 |
bufio.NewReader
func bufioDemo() {reader := bufio.NewReader(os.Stdin) // 从规范输出生成读对象
fmt.Print("请输出内容:")
text, _ := reader.ReadString('\n') // 读到换行
text = strings.TrimSpace(text)
fmt.Printf("%#v\n", text)
}
Fscan 系列
fmt.Scan、fmt.Scanf、fmt.Scanln 三个函数,只不过它们不是从规范输出中读取数据而是从 io.Reader 中读取数据。
Sscan 系列
fmt.Scan、fmt.Scanf、fmt.Scanln 三个函数,只不过它们不是从规范输出中读取数据而是从指定字符串中读取数据。