Я думаю, вам нужно что-то вроде termbox-go
https://github.com/nsf/termbox-go
package main
import (
"fmt"
termbox "github.com/nsf/termbox-go"
"io/ioutil"
"net/http"
"os"
)
/*
this is a simple cli program, this keeps polling the command line argument
until tab or Esc is pressed,
if TAB is pressed it does a google search of the word previous to that
and exists incase someone presses enter
*/
func main() {
termbox.Init()
defer termbox.Close()
var searchString string
for {
ev := termbox.PollEvent()
switch ev.Type {
case termbox.EventKey:
switch ev.Key {
case termbox.KeyTab:
meaning := getMeaningFromWeb(searchString)
fmt.Println(meaning)
searchString = ""
continue
case termbox.KeyEsc:
panic(1)
default:
searchString = searchString + string(ev.Ch)
}
case termbox.EventError:
os.Exit(1)
default:
continue
}
}
}
func getMeaningFromWeb(a string) string {
cl := &http.Client{}
req, err := http.NewRequest("GET", "https://www.reddit.com/r/wallpaper/search.json?q="+a, nil)
req.Header.Set("User-Agent", "whitespace")
req.Header.Set("Host", "reddit.com")
resp, err := cl.Do(req)
defer resp.Body.Close()
response, err := ioutil.ReadAll(resp.Body)
if err != nil {
return fmt.Sprintf("%v", response)
}
return fmt.Sprintf("%s", string(response))
}
это пример использования этого в приложении командной строки, если вы запустите это приложение, оно примет слова (при нажатии клавиши табуляции) и выйдет (при нажатии клавиши escape). это приложение ищет sub Reddit для обоев. Я печатаю ответ на терминал. Это не идеально, есть некоторый конфиг (я буду обновлять, как только смогу), который должен быть установлен для отображения пользовательского ввода. Плюс к этому пока нет фильтра backspace
. Вы не увидите, что вы печатаете, и вы не можете использовать клавишу Backspace, но остальная часть функционирует так, как я описал.