Go语言输入输出操作指南

📤标准输出操作

基础输出函数

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() 按格式输入 需要精确匹配
相关推荐
Toormi1 天前
Go 1.26在性能方面做了哪些提升?
开发语言·后端·golang
桂花很香,旭很美2 天前
[7天实战入门Go语言后端] Go 后端实战踩坑与解法手册
服务器·网络·golang
桂花很香,旭很美2 天前
[7天实战入门Go语言后端] Go 后端实战技术点讲解
开发语言·golang·iphone
hansaes2 天前
golang 内存模型与分配机制
golang
石牌桥网管2 天前
golang Context介绍
开发语言·算法·golang
lisypro12 天前
gin-vue-admin项目使用命令行进行启动
前端·vue.js·golang·gin
Tony Bai3 天前
Go 1.26 :go mod init 默认行为的变化与 Go 版本管理的哲学思辨
开发语言·后端·golang
桂花很香,旭很美3 天前
[7天实战入门Go语言后端] Day 7:综合实战——小型 REST API 与优雅关闭
开发语言·后端·golang