Golang: чтение ints от stdin до EOF при ошибках формата отчетности
nums := make([]int, 0)
{
    var d int
    for {
        _, err := fmt.Scan(&d)
        if err != nil {
            break
        }
        nums = append(nums, d)
    }
}
это работает для чтения в ints из 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)
    }
}
1 ответов
Вы можете сделать это так - когда вы получите плохое число, прочитайте следующую вещь, разделенную пробелом. Установите флаг или на ошибку или сохраните список ошибок для отчета в конце.
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]
