Golang fmt.Scanln 函数
最后修改时间 2025 年 5 月 8 日
本教程将介绍如何在 Go 中使用 `fmt.Scanln` 函数。我们将通过实际示例演示读取用户输入的输入基础知识。
`fmt.Scanln` 函数用于在 Go 中读取用户输入。它从标准输入扫描文本,将连续的空格分隔值存储到参数中。它在换行符处停止扫描。
在 Go 中,`fmt.Scanln` 类似于 `fmt.Scan`,但它会在换行符处停止扫描。它通常用于简单的命令行输入场景,当你想读取直到用户按下 Enter 键时。
fmt.Scanln 基本示例
`fmt.Scanln` 最简单的用法是从输入中读取单个值。本示例演示了如何从用户那里读取字符串。
注意: 输入读取直到第一个空格或换行符。
package main
import "fmt"
func main() {
var name string
fmt.Print("Enter your name: ")
fmt.Scanln(&name)
fmt.Printf("Hello, %s!\n", name)
}
该程序会提示输入姓名,使用 `fmt.Scanln` 读取姓名,然后向用户打招呼。`&` 运算符获取变量的内存地址。
读取多个值
`fmt.Scanln` 可以在一次调用中读取多个值。本示例展示了如何读取用空格分隔的多个值。
package main
import "fmt"
func main() {
var firstName, lastName string
var age int
fmt.Print("Enter first name, last name and age: ")
fmt.Scanln(&firstName, &lastName, &age)
fmt.Printf("%s %s is %d years old\n", firstName, lastName, age)
}
该函数将空格分隔的值读取到提供的变量中。当所有变量都已填充或遇到换行符时,输入停止。
处理输入错误
我们可以检查 `fmt.Scanln` 的返回值来检测输入错误。本示例展示了基本的错误处理。
package main
import "fmt"
func main() {
var number int
fmt.Print("Enter a number: ")
if _, err := fmt.Scanln(&number); err != nil {
fmt.Println("Invalid input:", err)
return
}
fmt.Printf("You entered: %d\n", number)
}
第二个返回值是一个错误,指示扫描是否失败。当期望特定类型的输入(如数字)时,这很有用。
读取直到换行符
与 `fmt.Scan` 不同,`fmt.Scanln` 在换行符处停止。本示例演示了行为上的差异。
package main
import "fmt"
func main() {
var a, b string
fmt.Println("Using Scanln (enter two words):")
fmt.Scanln(&a, &b)
fmt.Printf("Scanln got: %q and %q\n", a, b)
fmt.Println("Using Scan (enter two words):")
fmt.Scan(&a, &b)
fmt.Printf("Scan got: %q and %q\n", a, b)
}
`fmt.Scanln` 只会读取直到第一个换行符的输入。`fmt.Scan` 如果需要,将继续从后续行读取。
读取混合数据类型
`fmt.Scanln` 可以在一次调用中处理不同的变量类型。本示例展示了如何同时读取字符串和数字。
package main
import "fmt"
func main() {
var product string
var price float64
fmt.Print("Enter product name and price: ")
if _, err := fmt.Scanln(&product, &price); err != nil {
fmt.Println("Error:", err)
return
}
fmt.Printf("%s costs $%.2f\n", product, price)
}
该函数根据目标变量自动将输入转换为正确的类型。无效的转换会返回错误。
读取到切片中
我们可以通过读取到单个元素来使用 `fmt.Scanln` 和切片。本示例演示了如何将多个值读取到切片中。
package main
import "fmt"
func main() {
var numbers = make([]int, 3)
fmt.Print("Enter three numbers: ")
fmt.Scanln(&numbers[0], &numbers[1], &numbers[2])
sum := numbers[0] + numbers[1] + numbers[2]
fmt.Printf("Sum: %d\n", sum)
}
每个切片元素都必须单独寻址。该函数将值直接读取到切片的元素中。
高级错误处理
为了进行健壮的输入处理,我们可以将 `fmt.Scanln` 与其他技术结合使用。本示例展示了一个更完整的解决方案。
package main
import (
"bufio"
"fmt"
"os"
"strconv"
"strings"
)
func main() {
reader := bufio.NewReader(os.Stdin)
fmt.Print("Enter two numbers: ")
input, _ := reader.ReadString('\n')
input = strings.TrimSpace(input)
parts := strings.Split(input, " ")
if len(parts) != 2 {
fmt.Println("Please enter exactly two numbers")
return
}
num1, err1 := strconv.Atoi(parts[0])
num2, err2 := strconv.Atoi(parts[1])
if err1 != nil || err2 != nil {
fmt.Println("Please enter valid numbers")
return
}
fmt.Printf("Sum: %d\n", num1+num2)
}
这种方法提供了对输入解析和错误处理的更多控制。当 `fmt.Scanln` 的行为过于严格时,它很有用。
来源
本教程通过读取和处理用户输入的实际示例,涵盖了 Go 中的 `fmt.Scanln` 函数。