Golang fmt.Scan 函数
最后修改时间 2025 年 5 月 8 日
本教程将解释如何在 Go 中使用 fmt.Scan
函数。我们将通过读取用户输入的实际示例来涵盖输入基础知识。
fmt.Scan
函数用于从标准输入读取。它扫描从标准输入读取的文本,并将连续的以空格分隔的值存储到连续的参数中。换行符也算作空格。
在 Go 中,fmt.Scan
是 fmt 包中用于格式化 I/O 的一部分。它对于需要用户交互的简单命令行程序很有用。
基本的 fmt.Scan 示例
fmt.Scan
最简单的用法是从输入中读取单个值。此示例演示了基本的输入扫描。
注意: Scan 需要变量的指针作为参数。
package main import "fmt" func main() { var name string fmt.Print("Enter your name: ") fmt.Scan(&name) fmt.Printf("Hello, %s!\n", name) }
该程序提示输入姓名,使用 fmt.Scan
读取姓名,然后向用户打招呼。&
运算符获取变量的地址。
扫描多个值
fmt.Scan
可以读取由空格分隔的多个值。此示例展示了如何一次扫描多个值。
package main import "fmt" func main() { var firstName, lastName string var age int fmt.Print("Enter first name, last name, and age: ") fmt.Scan(&firstName, &lastName, &age) fmt.Printf("%s %s is %d years old\n", firstName, lastName, age) }
该程序在一个 Scan
调用中读取三个值。输入应以空格分隔(例如,“John Doe 30”)。
处理扫描错误
fmt.Scan
返回成功扫描的项数。此示例演示了如何使用返回值进行错误处理。
package main import "fmt" func main() { var a, b int fmt.Print("Enter two numbers: ") n, err := fmt.Scan(&a, &b) if err != nil { fmt.Println("Error:", err) return } if n != 2 { fmt.Println("Expected 2 values, got", n) return } fmt.Printf("Sum: %d\n", a+b) }
该程序同时检查扫描项的数量和任何错误。这使得输入处理更能抵御无效输入。
扫描不同数据类型
fmt.Scan
可以自动处理各种数据类型。此示例展示了如何在一次操作中扫描不同的类型。
package main import "fmt" func main() { var name string var age int var height float64 var student bool fmt.Print("Enter name, age, height, student (true/false): ") fmt.Scan(&name, &age, &height, &student) fmt.Printf("%s: %d years, %.2f m, student: %t\n", name, age, height, student) }
该程序读取字符串、整数、浮点数和布尔值。fmt.Scan
会自动将输入转换为正确的类型。
将 fmt.Scan 与切片一起使用
要将多个值读取到切片中,我们可以使用可变参数。此示例演示了如何将数据扫描到整数切片中。
package main import "fmt" func main() { numbers := make([]int, 3) fmt.Print("Enter 3 numbers: ") fmt.Scan(&numbers[0], &numbers[1], &numbers[2]) sum := 0 for _, num := range numbers { sum += num } fmt.Println("Sum:", sum) }
该程序将三个数字读入切片,然后计算它们的总和。每个切片元素都必须单独扫描其地址。
使用 fmt.Scan 扫描行
要读取包含空格的整行,fmt.Scan
有其局限性。此示例展示了一种读取整行的解决方法。
package main import ( "bufio" "fmt" "os" ) func main() { reader := bufio.NewReader(os.Stdin) fmt.Print("Enter a sentence: ") input, _ := reader.ReadString('\n') fmt.Print("You entered: ", input) }
对于基于行的输入,bufio.Reader
通常比 fmt.Scan
更好。此方法一直读取直到换行符。
使用 fmt.Scanf 进行高级扫描
对于格式化扫描,fmt.Scanf
提供了更多控制。此示例演示了基于模式的输入扫描。
package main import "fmt" func main() { var day, month, year int fmt.Print("Enter date (dd-mm-yyyy): ") fmt.Scanf("%d-%d-%d", &day, &month, &year) fmt.Printf("Date: %02d/%02d/%04d\n", day, month, year) }
fmt.Scanf
使用格式说明符来解析输入。输入必须匹配指定的格式(例如,“25-12-2023”)。
来源
本教程通过读取各种格式的用户输入的实际示例,涵盖了 Go 中的 fmt.Scan
函数。