Reading an integer from standard input

Viewed 113035

How do I use the fmt.Scanf function in Go to get an integer input from the standard input?

If this can't be done using fmt.Scanf, what's the best way to read a single integer?

7 Answers

You can use fmt.Scanf with a format specifier. The format specifier for the integer is %d. So you can use standard input like below.

func main() {
    var someVar int
    fmt.Scanf("%d", &someVar)
}

or else you can use fmt.Scan or fmt.Scanln as below.

func main() {
   var someVar int
   fmt.Scanln(&someVar)
}

You could also use bufio.NewReader to read an integer from the standard input.

The below program:

  • Prompts for an integer input

  • Creates a bufio.Reader to read from standard input

  • Reads input till it encounters a newline character '\n' (Note that this will only read a single integer. Space separated values will not work)

  • Removes the newline character

  • Converts string to int

package main

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

func getInt() error {
    fmt.Println("Enter an integer")
    userInput  := bufio.NewReader(os.Stdin)
    userVal, err := userInput.ReadString('\n')
    if err != nil {
        return err
    }

    input := strings.TrimSpace(userVal)
    intVal, err := strconv.Atoi(input)
    if err != nil {
        return err
    }

    fmt.Printf("You entered: %d\n", intVal)
    return nil
}

func main() {
    getInt()
}

Why can't we just use a scanf? just like we use in C? it's working though.

package main
import "fmt"
func main() {
    var i int
    fmt.Scanf("%d", &i)
    fmt.Println(i)
}
Related