Golang:在报告格式错误时从stdin读取内容直到EOF

Ale*_*lec 10 go

nums := make([]int, 0)
{
    var d int
    for {
        _, err := fmt.Scan(&d)
        if err != nil {
            break
        }

        nums = append(nums, d)
    }
}
Run Code Online (Sandbox Code Playgroud)

这可以从stdin中读取整数.但是如果stdin看起来像1 2 3 f4 5,nums最终会[1 2 3]报告没有任何错误.

处理这个问题的最佳方法是什么?(即,我希望EOF fmt.Scan以静默方式退出循环,但应报告所有其他错误).

编辑: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)
    }
}
Run Code Online (Sandbox Code Playgroud)

Nic*_*ood 13

你可以这样做 - 当你得到一个坏号码时,阅读下一个空格分隔的东西.设置标志或错误或保留最后报告的错误列表.

(游乐场链接)

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)
}
Run Code Online (Sandbox Code Playgroud)

哪个打印

Skipping bad number: "f4"
nums = [1 2 3 5]
Run Code Online (Sandbox Code Playgroud)