如何使用fmt.Sscan将整数解析成数组?

时间:2015-02-19 10:58:32

标签: go

我试图将字符串中的整数列表扫描到数组中(或者是切片)

package main

import "fmt"

func main() {
    var nums [5]int
    n, _ := fmt.Sscan("1 2 3 4 5", &nums)  // doesn't work
    fmt.Println(nums)
}

我需要将Sscan作为第二个参数传递给它才能使其正常工作?

我知道我可以通过nums[0], nums[1] ...等,但我更喜欢一个论点。

3 个答案:

答案 0 :(得分:6)

我认为这不是一个方便的单行。当Sscan接受...interface{}时,您还需要传递切片接口,因此首先转换数组:

func main() {
    var nums [5]int

    // Convert to interfaces
    xnums := make([]interface{}, len(nums))
    for n := range nums {
        xnums[n] = &nums[n]
    }

    n, err := fmt.Sscan("1 2 3 4 5", xnums...)
    if err != nil {
        fmt.Printf("field %d: %s\n", n+1, err)
    }

    fmt.Println(nums)
}

http://play.golang.org/p/1X28J7JJwl

显然,您可以在界面数组中混合使用不同的类型,这样可以更轻松地扫描更复杂的字符串。对于简单的空间限制整数,最好使用strings.Splitbufio.Scanner以及strconv.Atoi

答案 1 :(得分:3)

为了使其能够处理不仅仅是硬编码的字符串,最好使用bufio.Scannerio.Reader接口来执行此操作:

package main

import (
    "bufio"
    "fmt"
    "io"
    "strconv"
    "strings"
)

func scanInts(r io.Reader) ([]int, error) {
    s := bufio.NewScanner(r)
    s.Split(bufio.ScanWords)
    var ints []int
    for s.Scan() {
        i, err := strconv.Atoi(s.Text())
        if err != nil {
            return ints, err
        }
        ints = append(ints, i)
    }
    return ints, s.Err()
}

func main() {
    input := "1 2 3 4 5"
    ints, err := scanInts(strings.NewReader(input))
    if err != nil {
        fmt.Println(err)
    }
    fmt.Println(ints)
}

产地:

  

[1 2 3 4 5]

Playground

答案 2 :(得分:1)

除非您特意尝试使用Sscann,否则您也可以尝试使用此选项:

  • 按空格分割输入字符串
  • 迭代生成的数组
  • 将每个字符串转换为int
  • 将结果值存储到int切片

像这样:

package main

import (
    "fmt"
    "strconv"
    "strings"
)

func main() {

    nums := make([]int, 0)
    for _, s := range strings.Split("1 2 3 4 5", " ") {
        i, e := strconv.Atoi(s)
        if e != nil {
            i = 0 // that was not a number, default to 0
        }
        nums = append(nums, i)
    }
    fmt.Println(nums)
}

http://play.golang.org/p/rCZl46Ixd4