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 函数。