User Input

This guide covers different methods of handling user input in Go programming language.

πŸ“ Basic Input Methods

Using fmt.Scan

package main

import "fmt"

func main() {
    var name string
    fmt.Print("Enter your name: ")
    fmt.Scan(&name)
    fmt.Printf("Hello, %s!\n", name)
}

Using fmt.Scanf

package main

import "fmt"

func main() {
    var name string
    var age int
    fmt.Print("Enter name and age (e.g., John 25): ")
    fmt.Scanf("%s %d", &name, &age)
    fmt.Printf("Name: %s, Age: %d\n", name, age)
}

Using fmt.Scanln

package main

import "fmt"

func main() {
    var input string
    fmt.Print("Enter text: ")
    fmt.Scanln(&input)
    fmt.Printf("You entered: %s\n", input)
}

πŸ“– Reading Strings

Using bufio.NewReader

package main

import (
    "bufio"
    "fmt"
    "os"
)

func main() {
    reader := bufio.NewReader(os.Stdin)
    fmt.Print("Enter text: ")
    text, _ := reader.ReadString('\n')
    fmt.Printf("You entered: %s", text)
}

Reading Multiple Lines

package main

import (
    "bufio"
    "fmt"
    "os"
)

func main() {
    scanner := bufio.NewScanner(os.Stdin)
    fmt.Println("Enter multiple lines (Ctrl+D to finish):")
    
    for scanner.Scan() {
        fmt.Println("You entered:", scanner.Text())
    }
}

πŸ”’ Reading Numbers

Integer Input

package main

import "fmt"

func main() {
    var number int
    fmt.Print("Enter a number: ")
    fmt.Scan(&number)
    fmt.Printf("You entered: %d\n", number)
}

Float Input

package main

import "fmt"

func main() {
    var number float64
    fmt.Print("Enter a decimal number: ")
    fmt.Scan(&number)
    fmt.Printf("You entered: %.2f\n", number)
}

🎯 Input Validation

Basic Validation

package main

import (
    "fmt"
    "strconv"
)

func main() {
    var input string
    fmt.Print("Enter a number: ")
    fmt.Scan(&input)
    
    number, err := strconv.Atoi(input)
    if err != nil {
        fmt.Println("Invalid number!")
        return
    }
    fmt.Printf("Valid number: %d\n", number)
}

Advanced Validation

package main

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

func main() {
    reader := bufio.NewReader(os.Stdin)
    
    for {
        fmt.Print("Enter email (or 'quit' to exit): ")
        input, _ := reader.ReadString('\n')
        input = strings.TrimSpace(input)
        
        if input == "quit" {
            break
        }
        
        if !strings.Contains(input, "@") {
            fmt.Println("Invalid email format!")
            continue
        }
        
        fmt.Printf("Valid email: %s\n", input)
    }
}

πŸ”„ Interactive Input

package main

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

func main() {
    reader := bufio.NewReader(os.Stdin)
    
    for {
        fmt.Println("\nMenu:")
        fmt.Println("1. Say Hello")
        fmt.Println("2. Show Time")
        fmt.Println("3. Exit")
        fmt.Print("Choose an option: ")
        
        input, _ := reader.ReadString('\n')
        input = strings.TrimSpace(input)
        
        switch input {
        case "1":
            fmt.Println("Hello!")
        case "2":
            fmt.Println("Current time is...")
        case "3":
            fmt.Println("Goodbye!")
            return
        default:
            fmt.Println("Invalid option!")
        }
    }
}

πŸ“ File Input

Reading from File

package main

import (
    "bufio"
    "fmt"
    "os"
)

func main() {
    file, err := os.Open("input.txt")
    if err != nil {
        fmt.Println("Error opening file:", err)
        return
    }
    defer file.Close()
    
    scanner := bufio.NewScanner(file)
    for scanner.Scan() {
        fmt.Println(scanner.Text())
    }
}

πŸ’‘ Best Practices

  1. Error Handling

    • Always check for errors when reading input

    • Provide clear error messages to users

    • Handle invalid input gracefully

  2. Input Buffering

    • Use bufio.NewReader for reading strings with spaces

    • Clear input buffer after reading

    • Handle newline characters properly

  3. Type Safety

    • Validate input before conversion

    • Use appropriate type conversion functions

    • Handle conversion errors

  4. User Experience

    • Provide clear prompts

    • Give feedback for invalid input

    • Allow ways to exit or cancel

πŸ”§ Common Issues and Solutions

Handling Newlines

package main

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

func main() {
    reader := bufio.NewReader(os.Stdin)
    fmt.Print("Enter text: ")
    
    // Read and trim newline
    input, _ := reader.ReadString('\n')
    input = strings.TrimSpace(input)
    
    fmt.Printf("You entered: %s\n", input)
}

Buffer Clearing

package main

import (
    "bufio"
    "fmt"
    "os"
)

func main() {
    reader := bufio.NewReader(os.Stdin)
    
    fmt.Print("Enter a number: ")
    var number int
    fmt.Scan(&number)
    
    // Clear buffer
    reader.ReadString('\n')
    
    fmt.Print("Enter text: ")
    text, _ := reader.ReadString('\n')
    fmt.Printf("Number: %d, Text: %s", number, text)
}

πŸ“š Additional Resources

Last updated

Was this helpful?