📤标准输出操作
基础输出函数
Go语言提供了三种基础的输出函数,每种都有其特定用途:
Go
package main
import "fmt"
func main() {
// 1. Print() - 不换行输出
fmt.Print("Hello, ")
fmt.Print("World!")
// 输出: Hello, World!
// 2. Println() - 输出并换行
fmt.Println("Hello, World!") // 自动添加换行
fmt.Println("This is a new line")
fmt.Println() // 只输出一个换行
// 3. Printf() - 格式化输出
name := "张三"
age := 25
fmt.Printf("姓名: %s, 年龄: %d\n", name, age)
// 输出: 姓名: 张三, 年龄: 25
}
输出到字符串
有时候我们需要将格式化内容保存到变量中,而不是直接输出:
Go
func main() {
name := "李四"
age := 30
city := "北京"
// Sprintf - 格式化并返回字符串
message := fmt.Sprintf("姓名: %s, 年龄: %d, 城市: %s", name, age, city)
fmt.Println(message) // 姓名: 李四, 年龄: 30, 城市: 北京
// Sprint/Sprintn - 简单转换为字符串
num := 123
str1 := fmt.Sprint(num)
str2 := fmt.Sprintln(num)
fmt.Printf("Sprint: '%s', Sprintln: '%s'\n", str1, str2)
}
格式化输出详解
常用格式化占位符
Go
func main() {
// 布尔类型
fmt.Printf("%t\n", true) // true
fmt.Printf("%t\n", false) // false
// 整数类型
num := 123
fmt.Printf("十进制: %d\n", num) // 123
fmt.Printf("二进制: %b\n", num) // 1111011
fmt.Printf("八进制: %o\n", num) // 173
fmt.Printf("十六进制: %x\n", num) // 7b
fmt.Printf("十六进制大写: %X\n", num) // 7B
// 浮点数
pi := 3.1415926
fmt.Printf("默认: %f\n", pi) // 3.141593
fmt.Printf("保留2位: %.2f\n", pi) // 3.14
fmt.Printf("科学计数法: %e\n", pi) // 3.141593e+00
fmt.Printf("根据情况选择: %g\n", pi) // 3.1415926
// 字符串和字符
str := "Hello"
ch := 'A'
fmt.Printf("字符串: %s\n", str) // Hello
fmt.Printf("带引号字符串: %q\n", str) // "Hello"
fmt.Printf("字符: %c\n", ch) // A
fmt.Printf("字符ASCII: %d\n", ch) // 65
// 指针
x := 100
fmt.Printf("指针地址: %p\n", &x) // 0xc0000b4000
}
宽度和精度控制
Go
func main() {
// 宽度控制
fmt.Printf("|%8d|%8d|\n", 123, 456) // | 123| 456|
fmt.Printf("|%-8d|%-8d|\n", 123, 456) // |123 |456 |
fmt.Printf("|%08d|%08d|\n", 123, 456) // |00000123|00000456|
// 字符串宽度
fmt.Printf("|%8s|%8s|\n", "hello", "world") // | hello| world|
fmt.Printf("|%-8s|%-8s|\n", "hello", "world") // |hello |world |
// 浮点数精度
fmt.Printf("%.2f\n", 3.14159) // 3.14
fmt.Printf("%8.2f\n", 3.14159) // " 3.14"
fmt.Printf("%08.2f\n", 3.14159) // "00003.14"
// 动态宽度和精度
width, precision := 8, 2
fmt.Printf("%*.*f\n", width, precision, 3.14159) // " 3.14"
}
📥标准输入操作
基础输入函数
Go
package main
import "fmt"
func main() {
var name string
var age int
var height float64
var isStudent bool
// Scan() - 从标准输入扫描
fmt.Print("请输入姓名: ")
fmt.Scan(&name)
// Scanln() - 读取到换行符为止
fmt.Print("请输入年龄: ")
fmt.Scanln(&age)
// Scanf() - 格式化输入
fmt.Print("请输入身高: ")
fmt.Scanf("%f", &height)
// 布尔类型输入
fmt.Print("是否是学生 (true/false): ")
fmt.Scan(&isStudent)
fmt.Printf("\n=== 用户信息 ===\n")
fmt.Printf("姓名: %s\n", name)
fmt.Printf("年龄: %d\n", age)
fmt.Printf("身高: %.1fcm\n", height)
fmt.Printf("学生: %t\n", isStudent)
}
多值输入
Go
func main() {
var (
name string
age int
city string
)
// 一次性读取多个值(空格分隔)
fmt.Println("请输入姓名、年龄、城市(用空格分隔):")
fmt.Scan(&name, &age, &city)
// 输入示例: 张三 25 北京
fmt.Printf("姓名: %s, 年龄: %d, 城市: %s\n", name, age, city)
// 使用Scanln读取整行
fmt.Println("请输入一行文本:")
var line string
fmt.Scanln(&line) // 注意:只读取到第一个空格前
fmt.Printf("Scanln读取到: %s\n", line)
}
输入错误处理
Go
func main() {
var age int
fmt.Print("请输入您的年龄: ")
_, err := fmt.Scan(&age)
if err != nil {
fmt.Printf("❌ 输入错误: %v\n", err)
fmt.Println("请输入一个有效的整数!")
} else {
fmt.Printf("✅ 您输入的年龄是: %d\n", age)
}
}
📊 I/O操作对比
| 操作类型 | 函数 | 适用场景 | 特点 |
|---|---|---|---|
| 简单输出 | Print() |
普通输出 | 不换行 |
| 换行输出 | Println() |
需要换行的输出 | 自动添加空格和换行 |
| 格式化输出 | Printf() |
需要格式化的输出 | 灵活强大 |
| 字符串输出 | Sprint*() |
构建字符串 | 不直接输出 |
| 简单输入 | Scan*() |
基础类型输入 | 简单但功能有限 |
| 格式化输入 | Scanf() |
按格式输入 | 需要精确匹配 |