我想从go程序的原始stdin中读取.例如,如果我这样做stdin,我希望能够访问"test stdin".我试过读echo test stdin | go run test.go,但如果没有,那么它会等待输入.我也尝试先检查大小,但os.Stdin即使传入输入也是0.
我能做什么?
我开始在go中进行编程竞赛(只是为了学习语言)并且我惊讶地发现了
var T int
fmt.Scanf("%d", &T)
Run Code Online (Sandbox Code Playgroud)
是难以想象的慢.多慢?要读取10 ^ 5个整数,它需要2.5秒(相比之下python在0.8秒内完成).
那么,为什么它这么慢,我应该如何正确读取int,uint64和float64?
我的目的是按顺序打印字符串,当用户输入某个字符时,我们暂停进程并读取标准输入内容。我知道可以捕获 os.Interrupt 信号,但我不知道如何捕获标准输入中的事件。我不想扫描并等待用户输入文本。当有按键事件时,该过程停止。
我的问题:如何检测标准输入上的事件?
这是当前的解决方案以及您的建议。Go 例程并不构成最佳解决方案,因为您无法将它们作为线程进行管理。我目前正在继续致力于此工作并随时向您通报最新情况。
func main() {
quit := make(chan bool)
scanner := bufio.NewScanner(os.Stdin)
for scanner.Scan() {
fmt.Println(scanner.Text())
fmt.Println("-----------------")
fmt.Println("Go routine running :", runtime.NumGoroutine())
go func() {
select {
case <-quit:
return
default:
fmt.Println("Text received and changed")
fmt.Println("-----------------")
for {
timer := time.NewTimer(time.Second * 1)
<-timer.C
fmt.Println(scanner.Text())
}
}
fmt.Println("Routine closed")
}()
}
if scanner.Err() != nil {
quit <- false
}
}
Run Code Online (Sandbox Code Playgroud)
否则,如果我遵循你的解决方案@varius:
func main() {
scanner := bufio.NewScanner(os.Stdin)
for scanner.Scan() {
for {
timer := time.NewTimer(time.Second …Run Code Online (Sandbox Code Playgroud) package main
import (
"bufio"
"fmt"
"os"
)
func main() {
fmt.Println("insert y value here: ")
input := bufio.NewScanner(os.Stdin)
fmt.Println(input.Text)
}
Run Code Online (Sandbox Code Playgroud)
如何让程序等待,直到用户输入数据?
我正在尝试学习Go,但坚持使用这个:http://ideone.com/hbCamr或http://ideone.com/OvRw7t
package main
import "fmt"
func main(){
var i int
var f float64
var s string
_, err := fmt.Scan(&i)
if err == nil {
fmt.Println("read 1 integer: ",i)
} else {
fmt.Println("Error: ",err)
}
_, err = fmt.Scan(&f)
if err == nil {
fmt.Println("read 1 float64: ",f)
} else {
fmt.Println("Error: ",err)
}
_, err = fmt.Scan(&s)
if err == nil {
fmt.Println("read 1 string: ",s)
} else {
fmt.Println("Error: ",err)
}
_, err …Run Code Online (Sandbox Code Playgroud)