В Go (Golang) ожидание ввода пользователя — обычная задача при создании интерактивных приложений командной строки. Хотите ли вы дождаться, пока пользователь нажмет клавишу Enter или захватить определенные комбинации клавиш, для этого существует несколько способов. В этой статье мы рассмотрим семь различных способов ожидания ввода пользователя в Golang, а также приведем примеры кода.
-
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. -
Метод 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. -
Метод 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, а затем продолжает выполнение. -
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, и предоставляет дополнительные функции, такие как обнаружение комбинаций клавиш. -
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предоставляет более многофункциональное средство чтения ввода с возможностями редактирования строк. Он позволяет ожидать ввода пользователя и предлагает пользователю ввести текст. -
Библиотека терминов:
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 для продолжения. -
Горутина с каналами Метод:
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 и создать более привлекательный пользовательский интерфейс.