如何使fmt.Scanln()读入整数切片

Fro*_*lik 10 go

我有一行包含3个数字,我想从stdin用fmt.Scanln()读取,但这段代码不起作用:

X := make([]int, 3)
fmt.Scanln(X...)
fmt.Printf("%v\n", X)
Run Code Online (Sandbox Code Playgroud)

我收到此错误消息:

cannot use X (type []int) as type []interface {} in function argument
Run Code Online (Sandbox Code Playgroud)

我不明白.

vou*_*rus 11

惯用Go将是:

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

interface{}没意思.如果您不需要,请不要使用它.


pet*_*rSO 5

例如,

package main

import "fmt"

func intScanln(n int) ([]int, error) {
    x := make([]int, n)
    y := make([]interface{}, len(x))
    for i := range x {
        y[i] = &x[i]
    }
    n, err := fmt.Scanln(y...)
    x = x[:n]
    return x, err
}

func main() {
    x, err := intScanln(3)
    if err != nil {
        fmt.Println(err)
        return
    }
    fmt.Printf("%v\n", x)
}
Run Code Online (Sandbox Code Playgroud)

输入:

1 2 3
Run Code Online (Sandbox Code Playgroud)

输出:

[1 2 3]
Run Code Online (Sandbox Code Playgroud)

  • 如果我的输入不是静态的而不是 3 的长度怎么办?即有时```[1]``` 有时```[1,2,3,4,5]``` (2认同)