[TOC]
fmt 用类似于C的printf和scanf的函数实现格式化的I/O。
## 输出函数
`Print` 系列的输出函数
```go
func Print(a ...any) (n int, err error) // 打印内容
func Printf(format string, a ...any) (n int, err error) // 格式化打印内容
func Println(a ...any) (n int, err error) // 打印内容,默认带换行符。
```
`Sprint` 系列的输出函数
```go
func Sprint(a ...any) string // 返回字符串的内容
func Sprintf(format string, a ...any) string // 返回字符串的格式化内容
func Sprintln(a ...any) string // 返回字符串的内容,默认带换行符
```
`Fprint` 系列的输出函数
```go
func Fprint(w io.Writer, a ...any) (n int, err error) // 将内容a,写入w。返回写入字节数以及err信息
func Fprintf(w io.Writer, format string, a ...any) (n int, err error) // 将格式化内容a,写入w。返回写入字节数以及err信息
func Fprintln(w io.Writer, a ...any) (n int, err error) // 将内容a(默认带换行符),写入w。返回写入字节数以及err信息
```
输出函数示例
```go
package main
import (
"fmt"
"os"
)
func main() {
// Print 系列的输出函数
name := "jiaxzeng"
fmt.Print("hello ", name, "\n")
fmt.Printf("hello %s\n", name)
fmt.Println("hello", name)
// Sprint 系列的输出函数
fmt.Print("\n-------------------------------------\n")
s := fmt.Sprint("hello ", name)
fmt.Printf("s: %v\n", s)
s = fmt.Sprintf("hello %s", name)
fmt.Printf("s: %v\n", s)
s = fmt.Sprintln("hello", name)
fmt.Printf("s: %v\n", s)
// Fprint 系列的输出函数
fmt.Print("\n-------------------------------------\n")
n, err := fmt.Fprint(os.Stdin, "hello ", name, ", ")
if err != nil {
fmt.Printf("Fprint failed, err: %v", err)
} else {
fmt.Printf("Byte size: %v\n", n)
}
n, err = fmt.Fprintf(os.Stdout, "hello %v, ", name)
if err != nil {
fmt.Printf("Fprint failed, err: %v", err)
} else {
fmt.Printf("Byte size: %v\n", n)
}
n, err = fmt.Fprintln(os.Stdout, "hello", name)
if err != nil {
fmt.Printf("Fprint failed, err: %v", err)
} else {
fmt.Printf("Byte size: %v\n", n)
}
}
// 运行结果
// hello jiaxzeng
// hello jiaxzeng
// hello jiaxzeng
// -------------------------------------
// s: hello jiaxzeng
// s: hello jiaxzeng
// s: hello jiaxzeng
// -------------------------------------
// hello jiaxzeng, Byte size: 16
// hello jiaxzeng, Byte size: 16
// hello jiaxzeng
// Byte size: 15
```
## 输入函数
`Scan` 系列的输入函数
> 从 os.Stdin 赋值给 变量a
```go
func Scan(a ...any) (n int, err error) // 变量a 是多个时,分割符可以是换行或空格
func Scanf(format string, a ...any) (n int, err error) // 格式化字符串时,连接符需要与字符串隔开;变量a 是多个时,只能一行输入且需要输入指定的分隔符。
func Scanln(a ...any) (n int, err error) // 变量a 是多个时,分隔符只能是空格。
```
`Sscan` 系列的输入函数
> 从 字符串str 赋值给 变量a
```go
// 变量str 包含\n \t 空格,当做分割符识别对应的参数个数
func Sscan(str string, a ...any) (n int, err error)
// 变量str 包含\n \t 空格时,格式化字符串也需要对应个数的\n \t 空格。
func Sscanf(str string, format string, a ...any) (n int, err error)
// 与Sscan类似,但是变量str不能包含 \n
func Sscanln(str string, a ...any) (n int, err error)
```
`Fscan` 系列的输入函数
> 从 `io.Reader` 赋值给 变量a ,`io.Reader` 可以通过 `strings.NewReader` 函数返回得到。
```go
// 变量r 包含\n \t 空格,当做分割符识别对应的参数个数
func Fscan(r io.Reader, a ...any) (n int, err error)
// 变量r 包含\n \t 空格时,格式化字符串也需要对应个数的\n \t 空格。
func Fscanf(r io.Reader, format string, a ...any) (n int, err error)
// 与Fscan类似,但是变量r不能包含 \n
func Fscanln(r io.Reader, a ...any) (n int, err error)
```
输入函数示例
```go
package main
import (
"fmt"
"os"
"strings"
)
func main() {
// Scan 系列的输入函数
fmt.Print("\n-------------------------------------\n")
var (
i int
str string
)
fmt.Print("请输入数据: ")
// fmt.Scan(&str, &i)
// fmt.Scanf("%s + %d", &str, &i)
fmt.Scanln(&str, &i)
fmt.Printf("type is: %T, value is: %v\n", str, str)
fmt.Printf("type is: %T, value is: %v\n", i, i)
// Sscan 系列的输入函数
fmt.Print("\n-------------------------------------\n")
fmt.Sscan("jiaxzeng \n 323", &str, &i)
fmt.Sscanf("jiaxzeng age is 18.", "%s age is %d.", &str, &i)
fmt.Sscanln("jiaxzeng \n 456", &str, &i)
fmt.Println(str, i)
// Fscan 系列的输入函数
fmt.Print("\n-------------------------------------\n")
reader := strings.NewReader("xiaodunan \n 18")
fmt.Fscan(reader, &str, &i)
fmt.Printf("%s age is %d\n", str, i)
reader = strings.NewReader("xiaodunan is 18")
fmt.Fscanf(reader, "%s is %d", &str, &i)
fmt.Printf("%s age is %d\n", str, i)
reader = strings.NewReader("xiaodunan \n 18")
fmt.Fscanln(reader, &str, &i)
fmt.Printf("%s age is %d\n", str, i)
}
// 运行结果
// -------------------------------------
// 请输入数据: test
// type is: string, value is: test
// type is: int, value is: 0
// -------------------------------------
// jiaxzeng 18
// -------------------------------------
// xiaodunan age is 18
// xiaodunan age is 18
// xiaodunan age is 18
```
- Golang简介
- 开发环境
- Golang安装
- 编辑器及快捷键
- vscode插件
- 第一个程序
- 基础数据类型
- 变量及匿名变量
- 常量与iota
- 整型与浮点型
- 复数与布尔值
- 字符串
- 运算符
- 算术运算符
- 关系运算符
- 逻辑运算符
- 位运算符
- 赋值运算符
- 流程控制语句
- 获取用户输入
- if分支语句
- for循环语句
- switch语句
- break_continue_goto语法
- 高阶数据类型
- pointer指针
- array数组
- slice切片
- slice切片扩展
- map映射
- 函数
- 函数定义和调用
- 函数参数
- 函数返回值
- 作用域
- 函数形参传递
- 匿名函数
- 高阶函数
- 闭包
- defer语句
- 内置函数
- fmt
- strconv
- strings
- time
- os
- io
- 文件操作
- 编码
- 字符与字节
- 字符串
- 读写文件
- 结构体
- 类型别名和自定义类型
- 结构体声明
- 结构体实例化
- 模拟构造函数
- 方法接收器
- 匿名字段
- 嵌套与继承
- 序列化
- 接口
- 接口类型
- 值接收者和指针接收者
- 类型与接口对应关系
- 空接口
- 接口值
- 类型断言
- 并发编程
- 基本概念
- goroutine
- channel
- select
- 并发安全
- 练习题
- 第三方库
- Survey
- cobra