当前位置: 首页 > news >正文

Go语言“fmt”包详解

Go语言“fmt”包详解

在Go语言开发中,fmt包是我们日常使用最频繁的标准库之一,它提供了格式化输入输出的核心功能。无论是调试时打印变量,还是接收用户输入,都离不开fmt包的支持。

本文将重点讲解fmt包中最常用的PrintlnPrintfScan系列函数,并补充其他实用函数的使用场景,帮你彻底掌握Go语言的格式化操作。

一、输出函数核心:Println与Printf的区别

在打印信息时,我们最常用的就是PrintlnPrintf,但很多新手容易混淆两者的用法。下面通过对比详解它们的核心差异。

1. Println:简单输出的"快捷方式"

Println的设计理念是"简单快速",它不需要复杂的格式控制,适合快速输出变量或常量信息。

核心特点

  • 自动在参数之间添加空格
  • 自动在输出末尾添加换行符
  • 无需指定格式,直接打印值的默认格式

示例代码

package mainimport "fmt"func main() {num := 2023str := "Go语言"pi := 3.14159// 多个参数用逗号分隔fmt.Println("数字:", num, "字符串:", str, "圆周率:", pi)// 单个参数也会自动换行fmt.Println("单独一行")
}

输出结果

数字: 2023 字符串: Go语言 圆周率: 3.14159
单独一行

适用场景:快速调试、简单信息打印、不需要精确格式控制的场景。

2. Printf:精确控制格式的"格式化大师"

Printf的核心能力是格式化输出,通过"格式化字符串"和"占位符",我们可以精确控制输出的样式,这在需要规范输出格式的场景中非常实用。

核心特点

  • 需要传入格式化字符串(包含占位符)
  • 按占位符指定的格式输出后续参数
  • 不会自动换行,需手动添加\n
  • 支持丰富的格式控制(如小数位数、对齐方式等)

常用占位符

占位符含义示例
%d十进制整数100
%s字符串"Hello"
%f浮点数3.14
%t布尔值true/false
%v自动匹配类型的默认格式任意类型
%.2f保留2位小数的浮点数3.14
%5d占5位宽度的整数(右对齐) 100(前补空格)

示例代码

package mainimport "fmt"func main() {name := "小明"age := 25score := 95.5// 格式化字符串中用占位符对应后续参数fmt.Printf("姓名:%s,年龄:%d岁,成绩:%.1f分\n", name, age, score)// 演示数字格式化fmt.Printf("整数格式化:%5d\n", 100) // 占5位宽度fmt.Printf("浮点数格式化:%.2f\n", 3.14159) // 保留2位小数
}

输出结果

姓名:小明,年龄:25岁,成绩:95.5分
整数格式化:  100
浮点数格式化:3.14

适用场景:格式化日志输出、数据报表展示、需要统一格式的信息打印等。

3. Println与Printf对比总结

维度PrintlnPrintf
格式控制无,使用默认格式通过格式化字符串精确控制
空格与换行自动加空格和换行需手动加\n,参数间无自动空格
使用复杂度简单,直接传参数稍复杂,需掌握占位符用法
适用场景快速调试、简单输出格式规范的输出、日志等

二、输入函数核心:Scan系列如何读取用户输入

除了输出,fmt包还提供了从标准输入(通常是键盘)读取数据的能力,其中ScanScanln是最常用的输入函数。

1. Scan:按空白分隔读取数据

Scan函数会从标准输入读取数据,以空白字符(空格、制表符、换行符等)作为分隔符,将读取到的值依次存储到后续参数指定的变量中。

核心特点

  • 自动忽略输入中的空白字符(包括换行)
  • 读取到足够的参数后停止(未读完的输入会保留到下一次读取)
  • 变量必须传递地址(使用&符号),否则无法赋值

示例代码

package mainimport "fmt"func main() {var name stringvar age intvar score float64fmt.Println("请输入姓名、年龄、成绩(用空格分隔):")// 传递变量地址,按顺序接收输入n, err := fmt.Scan(&name, &age, &score)if err != nil {fmt.Println("输入错误:", err)return}fmt.Printf("读取成功,共读取%d个值:\n", n)fmt.Printf("姓名:%s,年龄:%d,成绩:%.1f\n", name, age, score)
}

运行效果

请输入姓名、年龄、成绩(用空格分隔):
小明 25 95.5
读取成功,共读取3个值:
姓名:小明,年龄:25,成绩:95.5

2. Scanln:读取到换行符结束

ScanlnScan的主要区别是:Scanln在读取到换行符时会停止输入,而不会继续处理换行后的内容。

核心特点

  • 以空白字符分隔参数,但遇到换行符立即停止
  • 适合读取一行完整输入的场景
  • 同样需要传递变量地址

示例代码

package mainimport "fmt"func main() {var username stringvar password stringfmt.Println("请输入用户名和密码(空格分隔后回车):")// 读取到换行符停止,未读完的参数会导致错误n, err := fmt.Scanln(&username, &password)if err != nil {fmt.Println("输入错误:", err)return}fmt.Printf("用户名:%s,密码:%s\n", username, password)
}

运行效果

请输入用户名和密码(空格分隔后回车):
admin 123456
用户名:admin,密码:123456

3. Scan使用注意事项

  1. 必须传递变量地址Scan系列函数要求参数是变量的内存地址(用&获取),如果直接传变量名会报错。

  2. 输入格式必须匹配:如果输入的类型与变量类型不匹配(如给int变量输入字符串),会导致读取失败,返回错误。

  3. 空白字符的处理Scan忽略所有空白(包括换行),Scanln在换行时停止,实际开发中需根据场景选择。

  4. 错误处理:始终检查Scan返回的错误,避免因输入异常导致程序逻辑错误。

三、其他常用“fmt”函数简介

除了上述核心函数,fmt包还有几个高频使用的函数,我们通过场景化示例快速了解。

1. Sprintf:生成格式化字符串

SprintfPrintf功能类似,但不会打印到终端,而是返回格式化后的字符串,适合需要将格式化内容作为变量使用的场景(如日志拼接、数据转换)。

示例代码

package mainimport "fmt"func main() {// 生成格式化字符串并赋值给变量userInfo := fmt.Sprintf("用户[ID:%d, 姓名:%s, 年龄:%d]", 1001, "张三", 30)// 后续可直接使用该字符串fmt.Println("用户信息:", userInfo)
}

输出结果

用户信息: 用户[ID:1001, 姓名:张三, 年龄:30]

2. Fprint系列:输出到文件或其他流

FprintFprintlnFprintf与前面的输出函数功能类似,但它们的第一个参数是io.Writer接口(如文件、网络连接等),用于将内容写入指定的输出流,而非标准终端。

示例:写入文件

package mainimport ("fmt""os"
)func main() {// 创建文件(实现了io.Writer接口)file, err := os.Create("user.log")if err != nil {fmt.Println("创建文件失败:", err)return}defer file.Close() // 确保文件最终关闭// 写入内容到文件fmt.Fprintln(file, "===== 用户日志 =====")fmt.Fprintf(file, "登录用户:%s,时间:%s\n", "admin", "2025-08-06")fmt.Fprint(file, "登录状态:成功")
}

运行后,user.log文件内容如下:

===== 用户日志 =====
登录用户:admin,时间:2025-08-06
登录状态:成功

3. 常用函数速查表

为了方便查阅,整理fmt包常用函数如下:

函数名功能描述示例输出示例
fmt.Print将一系列值输出到标准输出,值之间无分隔符,不自动换行fmt.Print("Hello", "World")HelloWorld
fmt.Println将一系列值输出到标准输出,值之间用空格分隔,最后自动换行fmt.Println("Hello", "World")Hello World
(换行)
fmt.Printf按照格式化字符串指定的格式将值输出到标准输出fmt.Printf("数字: %d, 字符串: %s", 10, "Hello")数字: 10, 字符串: Hello
fmt.Sprintf按照格式化字符串指定的格式返回一个格式化后的字符串,不进行输出result := fmt.Sprintf("数字: %d, 字符串: %s", 10, "Hello")
fmt.Println(result)
数字: 10, 字符串: Hello
(换行)
fmt.Fprint将一系列值输出到实现了io.Writer接口的对象,值之间无分隔符,不自动换行file, _ := os.Create("output.txt")
fmt.Fprint(file, "Hello", "World")
file.Close()
output.txt文件中写入HelloWorld
fmt.Fprintln将一系列值输出到实现了io.Writer接口的对象,值之间用空格分隔,最后自动换行file, _ := os.Create("output.txt")
fmt.Fprintln(file, "Hello", "World")
file.Close()
output.txt文件中写入Hello World
(换行)
fmt.Fprintf按照格式化字符串指定的格式将值输出到实现了io.Writer接口的对象file, _ := os.Create("output.txt")
fmt.Fprintf(file, "数字: %d, 字符串: %s", 10, "Hello")
file.Close()
output.txt文件中写入数字: 10, 字符串: Hello
fmt.Scan从标准输入读取数据,按照空白字符(空格、制表符、换行符等)分隔输入值,并将读取的值存储到指定的变量中var num int
fmt.Scan(&num)
fmt.Println(num)
假设输入10,则输出10
(换行)
用户输入10后,输出10
(换行)
fmt.Scanln从标准输入读取数据,读取到换行符结束,并将读取的值存储到指定的变量中var str string
fmt.Scanln(&str)
fmt.Println(str)
假设输入Hello World,则输出Hello World
(换行)
用户输入Hello World并回车后,输出Hello World
(换行)
fmt.Sscanf从字符串中按照格式化字符串指定的格式读取数据,并将读取的值存储到指定的变量中str := "10 Hello"
var num int
var s string
fmt.Sscanf(str, "%d %s", &num, &s)
fmt.Printf("数字: %d, 字符串: %s", num, s)
数字: 10, 字符串: Hello

四、总结

fmt包是Go语言中处理输入输出的基础工具,掌握其核心函数能极大提升开发效率:

  • Println 适合简单、快速的输出场景,自动处理空格和换行。
  • Printf 适合需要精确格式控制的场景,通过占位符实现灵活输出。
  • Scan系列 用于读取用户输入,注意传递变量地址和输入格式匹配。
  • SprintfFprint系列 扩展了格式化功能,分别用于生成字符串和写入文件/流。

建议在实际开发中多动手实践,根据具体场景选择合适的函数,避免盲目使用。

例如调试时用Println快速输出,日志记录用Printf规范格式,数据转换用Sprintf生成字符串,文件写入用Fprintf等。熟练掌握这些函数,能让你的Go代码更规范、高效!

http://www.dtcms.com/a/318627.html

相关文章:

  • KNN算法:从原理到实战应用
  • SDIO三种触发枚举的方式
  • Python高级排序技术:非原生可比对象的自定义排序策略详解
  • 第14届蓝桥杯Scratch选拔赛初级及中级(STEMA)真题2022年11月27日
  • Java面试宝典:类加载器分层设计与核心机制解析
  • 栈与队列的基本逻辑
  • ToonMe:将照片转换为卡通风格的艺术作品
  • docker run 入门到进阶:容器启动背后的门道
  • 嵌入式开发入门—电感器
  • CASA模型原理详细解析
  • 【unity 中的RectTransform组件中的`RectTransform.sizeDelta理解】
  • Unity3D水下场景与游泳系统开发指南
  • ubuntu18.04在fstab文件中挂载硬盘失败,系统进入紧急模式的解决方法
  • js 从 json 中取 key 的值
  • 云平台托管集群:EKS、GKE、AKS 深度解析与选型指南-第一章
  • 磁悬浮转子变转速工况下的振动抑制全解析
  • 什么是「回调函数」 Callback Function ?
  • Linux(17)——Linux进程信号(上)
  • 28.(vue3.x+vite)el-pagination中文设置(兼容其他elementPlus组件)
  • PaddleOCR 多线程并发问题
  • K8S命令记录
  • 利用多线程设计群ping工具
  • 5G随身WiFi怎么选?实测延迟/网速/续航,中兴V50适合商务,格行MT700适合短租、户外党~避坑指南+适用场景全解析
  • 无监督学习之K-means算法
  • 古多倍体化对被子植物适应性进化的遗传贡献--文献精度154
  • 本地部署 SQLite 数据库管理工具 SQLite Browser ( Web ) 并实现外部访问
  • 根据经纬度(从nc格式环境数据文件中)提取环境因子
  • RabbitMQ面试精讲 Day 12:镜像队列与Quorum队列对比
  • PCL 平面特征点提取
  • 2 SpringBoot项目对接单点登录说明