fmt.Scanln 意外换行错误:深入探讨 Go 的输入处理
许多 Go 开发者在以下情况时都会遇到“fmt.Scanln 预期换行错误”与用户输入交互。要理解此错误,深入研究 fmt.Scan 和 fmt.Scanln 的工作原理至关重要。
fmt.Scan 和空格分隔的输入
fmt.Scan 读取空格 -将输入与标准输入分开。提供给 fmt.Scan 的每个参数对应于由空格分隔的单个单词或值。换行符的存在被视为空格,允许多行输入。以下代码为例:
<code class="go">import "fmt" func main() { var i int _, err := fmt.Scan(&i) if err == nil { fmt.Println("read 1 integer: ", i) } }</code>
提供输入“123”,此代码将读取并打印“read 1 integer: 123”。
fmt.Scanln和换行符分隔输入
相反,fmt.Scanln 期望换行符作为分隔符。读取所有输入直到换行符后,它停止解析。 Scanln 文档中明确说明了这一点:
“Scanln 与 Scan 类似,但在换行符处停止扫描,并且在最后一项之后必须有换行符或 EOF。”
此行为具体表现为以下代码:
<code class="go">import "fmt" func main() { var s string _, err := fmt.Scanln(&s) if err == nil { fmt.Println("read 1 line: ", s) } }</code>
输入“每个人都喜欢冰淇淋”,此代码将读取并打印“读取 1 行:每个人都喜欢冰淇淋”。由空格分隔的“everybody”和“loves”的存在不会中断解析,因为 fmt.Scanln 仅由最后的换行符分隔。
理解错误
中在提供的初始示例中,Scanln 遇到错误“预期换行符”,因为输入字符串“每个人都喜欢冰淇淋”不以换行符结尾。要解决此问题,输入末尾必须存在换行符。
读取行的替代方法
如果目标是读取一行输入,请使用 ReadString来自 bufio.Reader 包是 fmt.Scanln 的可靠替代品:
<code class="go">import ( "bufio" "os" ) func main() { reader := bufio.NewReader(os.Stdin) line, err := reader.ReadString('\n') if err == nil { fmt.Println("read 1 line: ", line) } }</code>
以上是fmt.Scanln 意外换行错误:fmt.Scan 和 fmt.Scanln 之间有什么区别?的详细内容。更多信息请关注PHP中文网其他相关文章!