go 语言的 scanln 为什么忽略了一些输入?
在 go 语言中,scan 和 scanln 函数用于从输入流(通常是标准输入)中读取数据。据官方文档所述,scanln 函数的行为与 scan 函数相似,但会在遇到换行符时停止扫描。然而,在实际使用中,我们发现 scanln 函数有时会忽略一些输入。
让我们来看一个示例。以下代码使用 scan 函数逐个读取输入的整数:
package main import "fmt" func main() { for { var x int n, _ := fmt.scan(&x) fmt.println("n:", n, "x:", x) if n == 0 { break } } }
输入以下数据:
123 456 789
运行该程序后,控制台将打印:
n: 1 x: 123 n: 1 x: 456 n: 1 x: 789
接下来,我们修改代码,使用 scanln 函数代替 scan 函数:
package main import "fmt" func main() { for { var x int n, _ := fmt.scanln(&x) fmt.println("n:", n, "x:", x) if n == 0 { break } } }
相同的输入数据再次输入。这次,控制台打印:
n: 1 x: 123 n: 1 x: 56 n: 1 x: 89
正如你所见,当使用 scanln 函数时,程序意外地忽略了输入的最后一个字符。
原因在于,scanln 函数不仅在遇到换行符时停止扫描,它还会在最后一个元素后检查是否还有额外的字符。如果存在额外的字符,scanln 函数会报错。为了避免这个问题,在使用 scanln 函数时,需要确保最后一个输入元素后面有换行符或 eof(文件末尾)。
简而言之,当使用 scanln 函数读取输入时,如果最后一个输入元素后没有换行符或 eof,程序可能会忽略一些输入字符。对于简单的输入,建议使用 scan 函数来避免这种情况。
以上就是Go 语言中 Scanln 函数为何会忽略一些输入?的详细内容,更多请关注php中文网其它相关文章!