ZetCode

Golang fmt.Scan 函数

最后修改时间 2025 年 5 月 8 日

本教程将解释如何在 Go 中使用 fmt.Scan 函数。我们将通过读取用户输入的实际示例来涵盖输入基础知识。

fmt.Scan 函数用于从标准输入读取。它扫描从标准输入读取的文本,并将连续的以空格分隔的值存储到连续的参数中。换行符也算作空格。

在 Go 中,fmt.Scan 是 fmt 包中用于格式化 I/O 的一部分。它对于需要用户交互的简单命令行程序很有用。

基本的 fmt.Scan 示例

fmt.Scan 最简单的用法是从输入中读取单个值。此示例演示了基本的输入扫描。
注意: Scan 需要变量的指针作为参数。

basic_scan.go
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 可以读取由空格分隔的多个值。此示例展示了如何一次扫描多个值。

multiple_scan.go
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 返回成功扫描的项数。此示例演示了如何使用返回值进行错误处理。

scan_errors.go
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 可以自动处理各种数据类型。此示例展示了如何在一次操作中扫描不同的类型。

scan_types.go
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 与切片一起使用

要将多个值读取到切片中,我们可以使用可变参数。此示例演示了如何将数据扫描到整数切片中。

scan_slice.go
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 有其局限性。此示例展示了一种读取整行的解决方法。

scan_lines.go
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 提供了更多控制。此示例演示了基于模式的输入扫描。

scan_formatted.go
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 包文档

本教程通过读取各种格式的用户输入的实际示例,涵盖了 Go 中的 fmt.Scan 函数。

作者

我的名字是 Jan Bodnar,我是一名充满激情的程序员,拥有丰富的编程经验。自 2007 年以来,我一直撰写编程文章。迄今为止,我已撰写了 1,400 多篇文章和 8 本电子书。我在编程教学方面拥有十多年的经验。

列出所有 Golang 教程