2012-09-10 14 views
8

मैं प्रत्येक व्यक्तिगत कीस्ट्रोक को stdin के बाद सीधे एक चैनल में उपयोगकर्ता के कीस्ट्रोक भेजना चाहता हूं।बिना किसी नई लाइन के चैनल के लिए stdin कीस्ट्रोक भेजें

मैंने नीचे दिए गए कोड का प्रयास किया है, लेकिन यह वांछित परिणाम नहीं देता है क्योंकि नई लाइन दर्ज होने तक reader.ReadByte() विधि ब्लॉक।

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 
} 

कैसे मैं प्रत्येक उपयोगकर्ता इनपुट चरित्र एक नई पंक्ति चरित्र की आवश्यकता के बिना चैनल को तुरंत जाने के लिए मिल सकता है पर किसी भी सलाह के लिए धन्यवाद।

उत्तर

10

स्टडीन डिफ़ॉल्ट रूप से लाइन-बफर किया गया है। इसका मतलब यह है कि जब तक कोई नई लाइन नहीं आती है, तब तक यह आपको कोई इनपुट नहीं देगा। यह एक विशिष्ट बात नहीं है।

यह गैर-बफर किए गए तरीके से व्यवहार करने के लिए अत्यधिक प्लेटफॉर्म विशिष्ट है। जैसा कि रामी ने सुझाव दिया था, ncurses इसे करने का एक तरीका है। एक और विकल्प बहुत हल्का go-termbox पैकेज है।

आप (कम से कम लिनक्स पर) मैन्युअल रूप से यह सब क्या करना चाहते हैं, तो आप termios के लिए सी बाइंडिंग लेखन को देखने या जाओ में सीधे syscalls कर सकते हैं।

विंडोज़ जैसे प्लेटफ़ॉर्म इसे कैसे संभालते हैं, मुझे नहीं पता। आप ncurses या टर्मबॉक्स के लिए स्रोत कोड में खोद सकते हैं यह देखने के लिए कि उन्होंने यह कैसे किया।

+0

जानकारी के लिए धन्यवाद। मुझे खुशी है कि मैंने अपने प्रश्न से पूछा, या मैं इसे और भी लंबे समय तक काम करने की कोशिश कर रहा हूं। किसी भी मामले में, मुझे टर्मबॉक्स/एनसीआरएसई सुझाव और रामी का उल्लेख है। मैंने कभी इस दृष्टिकोण को नहीं माना होगा, लेकिन विशेष रूप से टर्मबॉक्स बहुत ही सुलभ प्रतीत होता है और वैसे भी करना चाहिए जो मैं चाहता हूं। – Kim

4

आप लिनक्सपर हैं, तो आप Goncurses पैकेज

http://code.google.com/p/goncurses/

यह कार्य होता है को देखने के लिए चाहते हो सकता है: getchar() जो है तुम क्या चाहते।