以下是 Go 语言 fmt
模块的完整方法详解及示例,涵盖所有核心功能:
一、输出函数
将数据写入标准输出、文件或字符串。
1. Print
/ Println
/ Printf
功能
Print
: 写入标准输出,不换行。Println
: 写入标准输出并换行。Printf
: 格式化写入标准输出。
示例
go
fmt.Print("Hello, ") // 输出:Hello,
fmt.Println("World!") // 输出:World!(换行)
fmt.Printf("%s %d\n", "Year:", 2023) // 输出:Year: 2023(换行)
2. Fprint
/ Fprintln
/ Fprintf
功能
将内容写入指定的 io.Writer
(如文件、网络连接)。
示例
go
file, _ := os.Create("output.txt")
fmt.Fprint(file, "Hello ") // 写入文件内容:Hello
fmt.Fprintln(file, "World!") // 写入文件内容:World!(换行)
fmt.Fprintf(file, "Value: %d", 100) // 写入文件内容:Value: 100
3. Sprint
/ Sprintln
/ Sprintf
功能
将内容格式化为字符串并返回。
示例
go
s1 := fmt.Sprint("Hello", 123) // s1 = "Hello123"
s2 := fmt.Sprintln("World!") // s2 = "World!\n"
s3 := fmt.Sprintf("Value: %d", 100) // s3 = "Value: 100"
二、输入函数
从标准输入、文件或字符串读取数据。
1. Scan
/ Scanln
/ Scanf
功能
Scan
: 从标准输入读取,以空格分隔。Scanln
: 读取到换行符停止。Scanf
: 按格式字符串读取。
示例
go
var a int
var b string
// 输入:10 ABC
fmt.Scan(&a, &b) // a=10, b="ABC"
// 输入:20 XYZ\n
fmt.Scanln(&a, &b) // a=20, b="XYZ"
// 输入:Number: 30
fmt.Scanf("Number: %d", &a) // a=30
2. Fscan
/ Fscanln
/ Fscanf
功能
从指定的 io.Reader
(如文件)读取数据。
示例
go
file, _ := os.Open("data.txt")
var x int
var y string
// 文件内容:100 Golang
fmt.Fscan(file, &x, &y) // x=100, y="Golang"
// 文件内容:200 Rust\n
fmt.Fscanln(file, &x, &y) // x=200, y="Rust"
// 文件内容:Value: 300
fmt.Fscanf(file, "Value: %d", &x) // x=300
3. Sscan
/ Sscanln
/ Sscanf
功能
从字符串解析数据。
示例
go
str := "404 Not Found"
var code int
var msg string
fmt.Sscan(str, &code, &msg) // code=404, msg="Not"
fmt.Sscanln("500 Error\n", &code, &msg) // code=500, msg="Error"
fmt.Sscanf("Status: 200 OK", "Status: %d %s", &code, &msg) // code=200, msg="OK"
三、格式化动词
常用格式化占位符(部分):
动词 | 说明 | 示例 |
---|---|---|
%v |
默认格式 | %v → {Alice 30} |
%d |
十进制整数 | %d → 25 |
%f |
浮点数 | %f → 3.141593 |
%s |
字符串 | %s → "hello" |
%t |
布尔值 | %t → true |
%p |
指针地址 | %p → 0xc0000a |
%T |
类型 | %T → int |
四、其他功能
1. Errorf
功能
生成格式化错误。
示例
go
err := fmt.Errorf("无效的用户ID: %d", -1)
// err.Error() = "无效的用户ID: -1"
2. Formatter
和 Stringer
接口
功能
自定义类型的格式化行为。
示例
go
type User struct {
Name string
Age int
}
// 实现 Stringer 接口
func (u User) String() string {
return fmt.Sprintf("%s (%d岁)", u.Name, u.Age)
}
// 实现 Formatter 接口
func (u User) Format(f fmt.State, verb rune) {
if verb == 'v' {
fmt.Fprintf(f, "User{Name:%s, Age:%d}", u.Name, u.Age)
}
}
u := User{"Bob", 30}
fmt.Println(u) // 输出:Bob (30岁)
fmt.Printf("%v", u) // 输出:User{Name:Bob, Age:30}
五、注意事项
-
错误处理 :
Scan
系列函数返回成功解析的项数和错误。gon, err := fmt.Scan(&a, &b) if err != nil { log.Fatal("输入错误:", err) }
-
性能 :频繁字符串拼接时,优先使用
strings.Builder
而非Sprintf
。
六、完整函数列表
函数签名 | 功能说明 |
---|---|
Print(a ...any) (n int, err error) |
标准输出 |
Println(a ...any) (n int, err error) |
标准输出并换行 |
Printf(format string, a ...any) (n int, err error) |
格式化输出 |
Fprint(w io.Writer, a ...any) (n int, err error) |
写入 io.Writer |
Sprint(a ...any) string |
返回格式化字符串 |
Errorf(format string, a ...any) error |
生成格式化错误 |
通过掌握 fmt
包的方法,可以高效处理输入输出、字符串格式化及错误生成。