Golang fmt.Scanf 函数
最后修改时间 2025 年 5 月 8 日
本教程解释了如何在 Go 中使用 fmt.Scanf
函数。我们将通过格式化输入的实际示例来介绍输入解析基础知识。
fmt.Scanf
函数从标准输入读取文本,根据格式字符串将连续的空格分隔的值存储到参数中。它返回成功扫描的项目数。
在 Go 中,fmt.Scanf
类似于 C 的 scanf,但具有类型安全。它对于解析具有已知格式的结构化输入数据非常有用。除非格式中另有规定,否则该函数会在换行符处停止扫描。
基本 fmt.Scanf 示例
fmt.Scanf
最简单的用法是从输入读取单个值。此示例演示了基本的整数输入解析。
注意: 务必检查返回值以确保扫描成功。
package main import "fmt" func main() { var age int fmt.Print("Enter your age: ") n, err := fmt.Scanf("%d", &age) if err != nil { fmt.Println("Error:", err) return } fmt.Printf("Scanned %d value(s): Age = %d\n", n, age) }
该程序从标准输入读取一个整数。%d
动词匹配十进制整数。我们将结果存储在 age
变量中。
读取多个值
fmt.Scanf
可以在一次调用中解析多个值。此示例展示了如何同时读取不同的数据类型。
package main import "fmt" func main() { var name string var age int var height float64 fmt.Print("Enter name, age, and height: ") n, err := fmt.Scanf("%s %d %f", &name, &age, &height) if err != nil { fmt.Println("Error:", err) return } fmt.Printf("Scanned %d values:\n", n) fmt.Printf("Name: %s\nAge: %d\nHeight: %.2f\n", name, age, height) }
格式字符串 "%s %d %f"
匹配一个字符串、一个整数和一个浮点数。输入中的值必须用空格分隔。顺序必须与变量匹配。
处理带空格的字符串输入
默认情况下,%s
在遇到空格时停止。此示例演示了如何读取包含空格的整个行或字符串。
package main import "fmt" func main() { var firstName, lastName string fmt.Print("Enter your full name: ") n, err := fmt.Scanf("%s %s", &firstName, &lastName) if err != nil { fmt.Println("Error:", err) return } fmt.Printf("Scanned %d names:\n", n) fmt.Printf("First: %s\nLast: %s\n", firstName, lastName) }
这会将两个单独的单词读入不同的变量。对于带有中间名的全名,请考虑改用 bufio.Scanner
。
使用 fmt.Scanf 自定义分隔符
fmt.Scanf
可以使用格式字符串解析带有自定义分隔符的输入。此示例演示了逗号分隔值解析。
package main import "fmt" func main() { var x, y int fmt.Print("Enter coordinates (x,y): ") n, err := fmt.Scanf("%d,%d", &x, &y) if err != nil { fmt.Println("Error:", err) return } fmt.Printf("Scanned %d values: (%d, %d)\n", n, x, y) }
格式字符串 "%d,%d"
期望用逗号分隔的两个整数。为了成功解析,输入必须精确匹配此格式。
读取直到换行符
要一直读取到换行符,请在格式字符串中包含 \n
。此示例演示了如何消耗整个输入行。
package main import "fmt" func main() { var message string fmt.Print("Enter a message: ") n, err := fmt.Scanf("%[^\n]\n", &message) if err != nil { fmt.Println("Error:", err) return } fmt.Printf("Scanned %d values:\nMessage: %q\n", n, message) }
格式 %[^\n]\n
读取所有字符直到换行符,然后消耗该换行符。这允许读取带空格的字符串。
使用 fmt.Scanf 验证输入
fmt.Scanf
可以在扫描过程中验证输入格式。此示例演示了日期格式验证。
package main import "fmt" func main() { var day, month, year int fmt.Print("Enter date (dd-mm-yyyy): ") n, err := fmt.Scanf("%d-%d-%d", &day, &month, &year) if err != nil || n != 3 { fmt.Println("Invalid date format") return } fmt.Printf("Date: %02d/%02d/%04d\n", day, month, year) }
格式 "%d-%d-%d"
确保输入匹配 dd-mm-yyyy 模式。返回值检查是否成功解析了所有三个值。
高级格式动词
fmt.Scanf
支持各种数据类型的格式动词。此示例显示了十六进制和布尔输入解析。
package main import "fmt" func main() { var hexValue int var flag bool var str string fmt.Print("Enter hex, bool, string (ex: 0x1A true text): ") n, err := fmt.Scanf("%x %t %s", &hexValue, &flag, &str) if err != nil { fmt.Println("Error:", err) return } fmt.Printf("Scanned %d values:\n", n) fmt.Printf("Hex: %#x\nBool: %t\nString: %q\n", hexValue, flag, str) }
%x
动词解析十六进制数,%t
解析布尔值,%s
解析字符串。每个动词都匹配输入中其特定类型。
来源
本教程通过格式化输入解析和验证的实际示例,介绍了 Go 中的 fmt.Scanf
函数。