Golang fmt.Scanf function
last modified May 8, 2025
This tutorial explains how to use the fmt.Scanf function in Go.
We'll cover input parsing basics with practical examples of formatted input.
The fmt.Scanf function scans text from standard input, storing successive space-separated values into arguments according to a format string. It returns the number of items successfully scanned.
In Go, fmt.Scanf is similar to C's scanf but with type safety.
It's useful for parsing structured input data with known formats. The function
stops scanning at newlines unless specified otherwise in the format.
Basic fmt.Scanf example
The simplest use of fmt.Scanf reads a single value from input.
This example demonstrates basic integer input parsing.
Note: Always check the return value for successful scanning.
package main
import "fmt"
func main() {
var age int
fmt.Print("Enter your age: ")
n, err := fmt.Scanf("%d", &age)
if err != nil {
fmt.Println("Error:", err)
return
}
fmt.Printf("Scanned %d value(s): Age = %d\n", n, age)
}
The program reads an integer from standard input. The %d verb
matches decimal integers. We store the result in the age variable.
Reading multiple values
fmt.Scanf can parse multiple values in one call. This example
shows how to read different data types simultaneously.
package main
import "fmt"
func main() {
var name string
var age int
var height float64
fmt.Print("Enter name, age, and height: ")
n, err := fmt.Scanf("%s %d %f", &name, &age, &height)
if err != nil {
fmt.Println("Error:", err)
return
}
fmt.Printf("Scanned %d values:\n", n)
fmt.Printf("Name: %s\nAge: %d\nHeight: %.2f\n",
name, age, height)
}
The format string "%s %d %f" matches a string, integer, and float.
Values must be space-separated in the input. The order must match the variables.
Handling string input with spaces
By default, %s stops at whitespace. This example shows how to
read entire lines or strings containing spaces.
package main
import "fmt"
func main() {
var firstName, lastName string
fmt.Print("Enter your full name: ")
n, err := fmt.Scanf("%s %s", &firstName, &lastName)
if err != nil {
fmt.Println("Error:", err)
return
}
fmt.Printf("Scanned %d names:\n", n)
fmt.Printf("First: %s\nLast: %s\n", firstName, lastName)
}
This reads two separate words into different variables. For full names with
middle names, consider using bufio.Scanner instead.
Custom delimiters with fmt.Scanf
fmt.Scanf can parse input with custom delimiters using the
format string. This example demonstrates comma-separated value parsing.
package main
import "fmt"
func main() {
var x, y int
fmt.Print("Enter coordinates (x,y): ")
n, err := fmt.Scanf("%d,%d", &x, &y)
if err != nil {
fmt.Println("Error:", err)
return
}
fmt.Printf("Scanned %d values: (%d, %d)\n", n, x, y)
}
The format string "%d,%d" expects two integers separated by a
comma. The input must exactly match this format for successful parsing.
Reading until newline
To read until newline, include \n in the format string. This
example shows how to consume the entire input line.
package main
import "fmt"
func main() {
var message string
fmt.Print("Enter a message: ")
n, err := fmt.Scanf("%[^\n]\n", &message)
if err != nil {
fmt.Println("Error:", err)
return
}
fmt.Printf("Scanned %d values:\nMessage: %q\n",
n, message)
}
The format %[^\n]\n reads all characters until newline, then
consumes the newline. This allows reading strings with spaces.
Validating input with fmt.Scanf
fmt.Scanf can validate input format during scanning. This example
demonstrates date format validation.
package main
import "fmt"
func main() {
var day, month, year int
fmt.Print("Enter date (dd-mm-yyyy): ")
n, err := fmt.Scanf("%d-%d-%d", &day, &month, &year)
if err != nil || n != 3 {
fmt.Println("Invalid date format")
return
}
fmt.Printf("Date: %02d/%02d/%04d\n", day, month, year)
}
The format "%d-%d-%d" ensures input matches the dd-mm-yyyy pattern.
The return value checks if all three values were successfully parsed.
Advanced format verbs
fmt.Scanf supports various format verbs for different data types.
This example shows hexadecimal and boolean input parsing.
package main
import "fmt"
func main() {
var hexValue int
var flag bool
var str string
fmt.Print("Enter hex, bool, string (ex: 0x1A true text): ")
n, err := fmt.Scanf("%x %t %s", &hexValue, &flag, &str)
if err != nil {
fmt.Println("Error:", err)
return
}
fmt.Printf("Scanned %d values:\n", n)
fmt.Printf("Hex: %#x\nBool: %t\nString: %q\n",
hexValue, flag, str)
}
The %x verb parses hexadecimal numbers, %t parses
booleans, and %s parses strings. Each verb matches its specific
type in the input.
Source
This tutorial covered the fmt.Scanf function in Go with practical
examples of formatted input parsing and validation.
Author
List all Golang tutorials.