
本文旨在解决Go语言中使用fmt.Scanln函数进行多重输入时遇到的“Scan: expected newline”错误,并提供正确的代码示例。通过本文,你将学会如何避免重复声明变量,以及如何使用fmt.Scanln函数接收多个输入值。
在Go语言中,fmt.Scanln函数用于从标准输入读取一行文本,并将扫描到的值存储到给定的变量中。当需要连续读取多个输入时,可能会遇到“Scan: expected newline”错误。 这个问题通常是由于在同一作用域内重复声明了err变量导致的。
问题分析
在原始代码中,err变量在每次调用fmt.Scanln之后都被重新声明,这在Go语言中是不允许的。每次使用短变量声明 := 时,都会尝试创建一个新的变量。如果变量已经在当前作用域中声明,则会导致编译错误。尽管在某些情况下,如果短变量声明能够同时赋值给已存在的变量和新的变量,Go编译器会允许这种做法,但在这里,每次都尝试声明一个新的err变量,从而导致了错误。
立即学习“go语言免费学习笔记(深入)”;
解决方案
正确的做法是在函数开始时声明err变量,然后在后续的fmt.Scanln调用中重复使用该变量,仅进行赋值操作。
代码示例
以下是修改后的代码示例:
package main
import (
"fmt"
)
func main() {
var err error
var username string
fmt.Print("Username: ")
_, err = fmt.Scanln(&username)
if err != nil {
fmt.Println("Error: ", err)
return
}
var password string
fmt.Print("Password: ")
_, err = fmt.Scanln(&password)
if err != nil {
fmt.Println("Error: ", err)
return
}
var status string
fmt.Print("Status: ")
_, err = fmt.Scanln(&status)
if err != nil {
fmt.Println("Error: ", err)
return
}
fmt.Println(username, password, status)
}代码解释
- 变量声明: 首先,在main函数中声明了err、username、password和status变量。err变量的类型为error,用于存储fmt.Scanln函数返回的错误信息。
- 多重输入: 每次调用fmt.Scanln函数时,都将返回值赋给预先声明的err变量。这样避免了重复声明变量的问题。
- 错误处理: 每次调用fmt.Scanln后,都会检查err是否为nil。如果err不为nil,则表示发生了错误,程序会打印错误信息并退出。
注意事项
- fmt.Scanln函数在遇到换行符时停止扫描。如果输入的内容包含空格,fmt.Scanln只会读取第一个空格之前的内容。如果需要读取包含空格的字符串,可以考虑使用bufio.NewReader(os.Stdin).ReadString('\n')。
- 在处理用户输入时,务必进行错误处理,以确保程序的健壮性。
总结
通过本文,你学习了如何使用fmt.Scanln函数在Go语言中进行多重输入,并避免了重复声明变量导致的错误。 记住,正确地声明和使用变量是编写健壮Go程序的关键。希望本文能够帮助你更好地理解和使用fmt.Scanln函数。










