
本文介绍了如何使用 fmt.Scanln() 函数从标准输入读取一行包含多个整数的数据,并将这些整数存储到切片中。文章详细讲解了标准库函数 fmt.Scan() 的用法,并提供了一个简洁高效的示例代码,帮助读者理解如何在 Go 语言中正确处理标准输入。
在 Go 语言中,从标准输入读取数据并将其存储到切片中是一个常见的需求。fmt.Scanln() 函数似乎是一个直接的选择,但它并不能直接将输入读取到整数切片中。 这是因为 fmt.Scanln() 的参数需要是 interface{} 类型,而直接传递 []int 会导致类型不匹配的错误。
为了实现这个目标,我们需要使用 fmt.Scan() 函数,并在循环中逐个读取整数并将其添加到切片中。以下是一个示例代码:
package main
import (
"fmt"
"strconv"
"strings"
)
func readIntSlice() ([]int, error) {
var input string
_, err := fmt.Scanln(&input)
if err != nil {
return nil, err
}
// 使用 strings.Split 分割字符串
strSlice := strings.Split(input, " ")
intSlice := make([]int, len(strSlice))
for i, strVal := range strSlice {
intVal, err := strconv.Atoi(strVal)
if err != nil {
return nil, fmt.Errorf("invalid input: %s", strVal)
}
intSlice[i] = intVal
}
return intSlice, nil
}
func main() {
fmt.Println("Please enter a line of integers separated by spaces:")
nums, err := readIntSlice()
if err != nil {
fmt.Println("Error:", err)
return
}
fmt.Printf("Read integers: %v\n", nums)
}或者,使用 fmt.Scan 逐个读取:
package main
import (
"fmt"
)
func readInts(n int) ([]int, error) {
in := make([]int, n)
for i := range in {
_, err := fmt.Scan(&in[i])
if err != nil {
return in[:i], err // 返回已读取的部分和错误
}
}
return in, nil
}
func main() {
fmt.Println("Please enter", n, "integers separated by spaces:")
n := 3 // 假设要读取 3 个整数
nums, err := readInts(n)
if err != nil {
fmt.Println("Error:", err)
return
}
fmt.Printf("Read integers: %v\n", nums)
}代码解释:
readInts(n int) ([]int, error) 函数:
main() 函数:
注意事项:
总结:
虽然 fmt.Scanln() 不能直接读取到整数切片,但我们可以使用 fmt.Scan() 函数,并在循环中逐个读取整数并将其添加到切片中。这种方法更加灵活,并且可以处理各种输入情况。通过理解 fmt.Scan() 的工作原理和错误处理,我们可以编写出健壮且可靠的 Go 程序来处理标准输入。另一种方法是先读取一行字符串,然后使用 strings.Split 分割字符串,最后使用 strconv.Atoi 将字符串转换为整数。选择哪种方法取决于具体的需求和个人偏好。
以上就是使用 fmt.Scanln() 读取整数切片的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号