7 способов дождаться ввода пользователя в Golang: включены примеры кода

В Go (Golang) ожидание ввода пользователя — обычная задача при создании интерактивных приложений командной строки. Хотите ли вы дождаться, пока пользователь нажмет клавишу Enter или захватить определенные комбинации клавиш, для этого существует несколько способов. В этой статье мы рассмотрим семь различных способов ожидания ввода пользователя в Golang, а также приведем примеры кода.

  1. bufio.NewReader().ReadString(‘\n’) Метод:

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

    Этот метод использует пакет bufioдля создания средства чтения, считывающего данные из стандартного потока ввода (os.Stdin). Он ожидает, пока пользователь введет строку, и завершается, когда пользователь нажимает Enter.

  2. Метод fmt.Scanln():

    package main
    import "fmt"
    func main() {
    var input string
    fmt.Print("Enter text: ")
    fmt.Scanln(&input)
    fmt.Println("You entered:", input)
    }

    Функция fmt.Scanln()сканирует вводимые пользователем данные и присваивает их указанным переменным. В этом примере он ожидает, пока пользователь введет строку, и сохраняет ее в переменной input.

  3. Метод os.Stdin.Read():

    package main
    import (
    "fmt"
    "os"
    )
    func main() {
    var buf [1]byte
    fmt.Print("Press Enter to continue...")
    os.Stdin.Read(buf[:])
    fmt.Println("Continuing...")
    }

    Этот метод использует os.Stdin.Read()для чтения одного байта из стандартного потока ввода. Он ждет, пока пользователь не нажмет Enter, а затем продолжает выполнение.

  4. github.com/eiannone/keyboard Пакет:

    package main
    import (
    "fmt"
    "log"
    "time"
    "github.com/eiannone/keyboard"
    )
    func main() {
    fmt.Println("Press Enter to continue...")
    char, _, err := keyboard.GetSingleKey()
    if err != nil {
        log.Fatal(err)
    }
    if char == 13 { // Enter key
        fmt.Println("Continuing...")
    }
    time.Sleep(2 * time.Second) // Sleep to prevent immediate termination
    }

    Пакет github.com/eiannone/keyboardпредоставляет более продвинутый способ сбора данных, вводимых пользователем. Он позволяет фиксировать отдельные нажатия клавиш, включая клавишу Enter, и предоставляет дополнительные функции, такие как обнаружение комбинаций клавиш.

  5. github.com/chzyer/readline Пакет:

    package main
    import (
    "fmt"
    "github.com/chzyer/readline"
    )
    func main() {
    rl, err := readline.New("> ")
    if err != nil {
        panic(err)
    }
    defer rl.Close()
    for {
        line, err := rl.Readline()
        if err != nil {
            break
        }
        fmt.Println("You entered:", line)
    }
    }

    Пакет github.com/chzyer/readlineпредоставляет более многофункциональное средство чтения ввода с возможностями редактирования строк. Он позволяет ожидать ввода пользователя и предлагает пользователю ввести текст.

  6. Библиотека терминов:

    package main
    import (
    "fmt"
    "log"
    "github.com/nsf/termbox-go"
    )
    func main() {
    err := termbox.Init()
    if err != nil {
        log.Fatal(err)
    }
    defer termbox.Close()
    fmt.Println("Press Enter to continue...")
    for {
        event := termbox.PollEvent()
        if event.Type == termbox.EventKey && event.Key == termbox.KeyEnter {
            fmt.Println("Continuing...")
            break
        }
    }
    }

    Библиотека github.com/nsf/termbox-goпредоставляет низкоуровневый способ взаимодействия с терминалом, включая захват событий клавиатуры. В этом примере пользователь ожидает нажатия клавиши Enter для продолжения.

  7. Горутина с каналами Метод:

    package main
    import (
    "fmt"
    "os"
    "os/signal"
    "syscall"
    )
    func main() {
    fmt.Println("Press Enter to continue...")
    done := make(chan bool)
    go func() {
        var input string
        fmt.Scanln(&input)
        done <- true
    }()
    <-done
    fmt.Println("Continuing...")
    }

    Этот метод использует горутины и каналы для ожидания ввода пользователя. Он запускает отдельную горутину для чтения пользовательского ввода и отправляет сигнал через канал при нажатии Enter.

Ожидание ввода пользователя в Golang может осуществляться различными методами, каждый из которых имеет свои преимущества и варианты использования. В этой статье мы рассмотрели семь различных методов, включая bufio.NewReader(), fmt.Scanln(), os.Stdin.Read(), github.com/eiannone/keyboard, . 19, библиотека Termbox и горутины с каналами. Эти методы обеспечивают гибкость и возможности в зависимости от ваших конкретных требований.

Используя эти методы, вы можете повысить интерактивность ваших приложений командной строки Golang и создать более привлекательный пользовательский интерфейс.