
本文介绍了如何使用 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) 函数:
NetShop网店系统下载NetShop软件特点介绍: 1、使用ASP.Net(c#)2.0、多层结构开发 2、前台设计不采用任何.NET内置控件读取数据,完全标签化模板处理,加快读取速度3、安全的数据添加删除读取操作,利用存储过程模式彻底防制SQL注入式攻击4、前台架构DIV+CSS兼容IE6,IE7,FF等,有利于搜索引挚收录5、后台内置强大的功能,整合多家网店系统的功能,加以优化。6、支持三种类型的数据库:Acces
- 接受一个整数 n 作为参数,表示要读取的整数数量。
- 创建一个长度为 n 的整数切片 in。
- 使用 for 循环遍历切片 in 的索引。
- 在循环中使用 fmt.Scan(&in[i]) 读取一个整数并将其存储到 in[i] 中。
- 如果读取过程中发生错误(例如,用户输入了非整数),则返回已读取的部分切片和错误信息。
- 如果成功读取了所有 n 个整数,则返回完整的切片和 nil 错误。
-
main() 函数:
- 提示用户输入 n 个以空格分隔的整数。
- 调用 readInts(n) 函数读取整数切片。
- 检查是否发生错误。如果发生错误,则打印错误信息并退出。
- 如果成功读取了整数切片,则打印切片的内容。
注意事项:
- fmt.Scan() 会跳过空格和换行符。
- 如果用户输入的整数数量少于 n,fmt.Scan() 会等待更多输入,直到读取到 n 个整数或遇到错误。
- 如果用户输入的整数数量多于 n,多余的输入会被忽略。
- fmt.Scan() 在遇到错误时会停止读取,并返回错误信息。
总结:
虽然 fmt.Scanln() 不能直接读取到整数切片,但我们可以使用 fmt.Scan() 函数,并在循环中逐个读取整数并将其添加到切片中。这种方法更加灵活,并且可以处理各种输入情况。通过理解 fmt.Scan() 的工作原理和错误处理,我们可以编写出健壮且可靠的 Go 程序来处理标准输入。另一种方法是先读取一行字符串,然后使用 strings.Split 分割字符串,最后使用 strconv.Atoi 将字符串转换为整数。选择哪种方法取决于具体的需求和个人偏好。









