Menghantar Ketukan Kekunci ke Saluran Tanpa Talian Baharu
Keperluan biasa dalam pengaturcaraan ialah menghantar ketukan kekunci daripada input pengguna ke saluran secara nyata- masa. Walau bagaimanapun, secara lalai, stdin adalah penampan baris, bermakna ia memerlukan aksara baris baharu untuk mencetuskan sebarang input.
Coretan kod yang anda berikan:
func chars() <-chan byte { ch := make(chan byte) reader := bufio.NewReader(os.Stdin) go func() { for { char, err := reader.ReadByte() if err != nil { log.Fatal(err) } ch <- char } }() return ch }
cuba untuk mencapai ini tetapi gagal kerana kepada sifat penampan talian stdin. Kaedah reader.ReadByte() akan menyekat sehingga baris baharu dimasukkan.
Satu penyelesaian, seperti yang dicadangkan dalam jawapan, ialah menggunakan ncurses, perpustakaan yang menyediakan satu set fungsi untuk kawalan terminal. Ncurses membolehkan anda mengkonfigurasi terminal untuk bertukar kepada mod bukan penimbal, memastikan setiap ketukan kekunci segera dihantar ke saluran.
Penyelesaian lain ialah menggunakan pakej go-termbox, yang menyediakan API peringkat lebih tinggi untuk bekerja dengan input dan output pada terminal. Dengan go-termbox, anda boleh mencapai input bukan penimbal dengan memanggil SetInputMode(InputEsc) sebelum membaca input pengguna.
Untuk pelaksanaan khusus Linux, anda boleh meneroka perpustakaan termios atau membuat syscall langsung menggunakan pakej syscall untuk mengkonfigurasi tingkah laku terminal. Kekhususan setiap platform pengendalian input buffer dan input bukan buffer perlu disiasat dalam dokumentasi atau kod sumber masing-masing.
Atas ialah kandungan terperinci Bagaimana untuk Menghantar Ketukan Kekunci ke Saluran Tanpa Talian Baharu dalam Masa Nyata?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!