我正在学习Go。
我的程序应该从stdin读取数据,直到我输入一个句号的行。
package main
import (
"os"
"fmt"
"bufio"
)
func main(){
in := bufio.NewReader(os.Stdin)
input := ""
for input != "." {
input, err := in.ReadString('\n')
if err != nil {
panic(err)
}
}
}
我应该如何修改for循环,以便在输入单个点时停止程序?
我尝试使用for语句实现while循环,我的方法有问题,条件错误,还是ReadString弄乱了我的数据?
答案 0 :(得分:14)
以防万一其他人遇到这个问题:
从Go 1.1开始,有一种更好的方法可以循环一些可用的输入。这就是我今天解决OP问题的方法:
package main
import (
"bufio"
"fmt"
"os"
)
func main() {
scanner := bufio.NewScanner(os.Stdin)
for scanner.Scan() {
line := scanner.Text()
if line == "." {
break
}
fmt.Println(line) // or do something else with line
}
}
scanner.Text()
会自动删除尾随换行符。
答案 1 :(得分:11)
...是ReadString弄乱我的数据吗?
不,不是。它正在阅读下一个'\n'
。这意味着,只有一个点的行将包含数据".\n"
或".\r\n"
,具体取决于操作系统。
要删除行结尾,我会input = strings.TrimRight(input, "\r\n")
答案 2 :(得分:0)
if($(this).scrollTop() >= 0 && $(this).scrollTop() < ($('.parent').height() - $('.inner').height())){
//fix the inner div here
} else {
//unfix it
}
之外的更多数据。它读取所有可用的输入,最大可达缓冲区大小。在并发访问os.Stdin的情况下,下一个读者可能会错过bufio之前读取的一些输入。下面是我的非缓冲“草稿”代码,用于绘制并行安全方法,从输入流中读取所有字符,直至 CR '\n'
char。
('\n')