nums := make([]int, 0)
{
var d int
for {
_, err := fmt.Scan(&d)
if err != nil {
break
}
nums = append(nums, d)
}
}
这可以从stdin中读取整数。但是,如果stdin看起来像1 2 3 f4 5
,nums
将最终成为[1 2 3]
而不报告任何错误。
处理此问题的最佳方法是什么? (即,我希望来自fmt.Scan
的EOF默默地退出循环,但是应该报告所有其他错误。)
修改:io.EOF
就是我所需要的 - 我没有在http://golang.org/pkg/fmt/
nums := make([]int, 0)
{
var d int
for {
_, err := fmt.Scan(&d)
if err != nil {
if err != io.EOF {
log.Fatal(err)
}
break
}
nums = append(nums, d)
}
}
答案 0 :(得分:12)
你可以这样做 - 当你得到一个坏号码时,阅读下一个空格分隔的东西。设置一个标志或错误或保留最后报告的错误列表。
package main
import (
"bytes"
"fmt"
"io"
)
func main() {
in := bytes.NewBufferString("1 2 3 f4 5")
nums := make([]int, 0)
var d int
for i := 0; i < 10; i++ {
_, err := fmt.Fscan(in, &d)
if err == io.EOF {
break
}
if err != nil {
var s string
_, err := fmt.Fscan(in, &s)
if err != nil {
break
}
fmt.Printf("Skipping bad number: %q\n", s)
} else {
nums = append(nums, d)
}
}
fmt.Printf("nums = %v\n", nums)
}
打印
Skipping bad number: "f4"
nums = [1 2 3 5]