所以我开始学习 Go 编程语言,并希望有人能够阐明为什么我会得到我得到的结果。我试图让程序从用户那里读取输入并将其显示回来,直到用户只输入换行符。 包主
import (
"fmt"
"os"
"bufio"
"strings"
)
func main(){
inputBuff := bufio.NewReader(os.Stdin)
line,_ := inputBuff.ReadString('\n')
for (!strings.EqualFold(line,"\n")){
line,err := inputBuff.ReadString('\n')
if err!=nil {
fmt.Println(err)
}
fmt.Println(line)
fmt.Println(!strings.EqualFold(line,"\n"))
}
}
我试图一次读取完整的字符串,所以我认为 bufio 比使用 Scan 会更好。我添加了最后一个打印以显示该方法返回 false 但循环继续执行。任何帮助将不胜感激。
最佳答案
循环内的 line
与您为检查启动的 line
不同。傅立叶:
package main
import (
"fmt"
"os"
"bufio"
"strings"
)
func main(){
inputBuff := bufio.NewReader(os.Stdin)
line,_ := inputBuff.ReadString('\n')
var err error
for (!strings.EqualFold(line,"\n")){
line,err = inputBuff.ReadString('\n')
if err!=nil {
fmt.Println(err)
}
fmt.Println(line)
fmt.Println(!strings.EqualFold(line,"\n"))
}
您在循环内使用了 :=
赋值运算符,如 line, err := ....
中。
这使得 Go 在 for 循环中创建一个名为 line
的新符号。但是 for 的检查在循环代码块的内部范围之外。所以它指的是在循环外启动的旧行
。
将循环内的运算符更改为=
不会创建新变量,但也不会初始化err
,所以我也预先定义了它。 err
可以在循环内声明,但这是多余的。
关于Golang for 循环不会停止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21521709/