在 Go 中,我们使用 scan()
函数从用户那里获取输入。例如,
package main
import "fmt"
func main() {
var name string
// takes input value for name
fmt.Print("Enter your name: ")
fmt.Scan(&name)
fmt.Printf("Name: %s", name)
}
输出
Enter your name: Rosie Name: Rosie
在上面的示例中,这一行
fmt.Scan(&name)
从用户那里获取输入值并将其分配给 name
变量。
Go 编程提供了 Scan()
方法的三个不同变体
fmt.Scan()
fmt.Scanln()
fmt.Scanf()
注意:所有这些函数都定义在 fmt
包下。因此,在使用这些函数之前,我们必须导入 fmt
包。
Go fmt.Scan()
如前所述,Scan()
函数从用户那里获取输入。但是,它只能获取直到空格的输入值。
当它遇到空格时,空格前面的值将分配给指定的变量。例如,
package main
import "fmt"
func main() {
var language string
// takes input value for name
fmt.Print("Enter your favorite language: ")
fmt.Scan(&language)
fmt.Printf("Favorite Language: %s", language)
}
输出
Enter your favorite language: Go Programming Favorite Language: Go
在上面的示例中,我们提供了输入值 Go Programming
。但是,我们只得到 Go
作为输出。
这是因为 Scan()
函数仅获取空格之前的输入值。
使用 Scan() 获取多个输入
在 Go 中,我们可以使用 Scan()
函数从用户那里获取多个输入。例如,
package main
import "fmt"
func main() {
// create variables
var name string
var age int
// take name and age input
fmt.Println("Enter your name and age:")
fmt.Scan(&name, &age)
// print input values
fmt.Printf("Name: %s\nAge: %d", name, age)
}
输出
Enter your name and age: Maria 27 Name: Maria Age: 27
在上面的示例中,我们创建了两个变量 name 和 age。请注意,我们使用了单个 Scan()
函数来获取两个变量的输入值。
fmt.Scan(&name, &age)
在这里,我们在两行中提供了两个输入值 Maria
和 27(输入值用换行符分隔)。在这种情况下,第一行的值被分配给 name 变量,第二行的值被分配给 age。
我们也可以通过用空格分隔来在同一行中提供两个值。
输出
Enter your name and age: Maria 27 Name: Maria Age: 27
在这种情况下,空格前面的值分配给第一个变量 name,空格后面的值分配给第二个变量 age。
Go fmt.Scanln()
我们使用 Scanln()
函数获取直到换行的输入值。当它遇到换行符时,它会停止获取输入值。例如,
package main
import "fmt"
func main() {
var name string
var age int
// take name and age input
fmt.Println("Enter your name and age:")
fmt.Scanln(&name, &age)
fmt.Printf("Name: %s\nAge: %d", name, age)
}
输出
Enter your name and age: Maria Name: Maria Age: 0
在上面的示例中,我们使用了 Scanln()
函数来获取 name 和 age 的两个输入值。
fmt.Scanln(&name, &age)
但是,当我们输入第一个值 Maria
后按 Enter 键时,程序会退出。这是因为 Scanln()
只获取到换行符为止的输入值,所以当它遇到 Maria
后面的 Enter 键时,就会停止输入。
如果我们想获取 age 的输入值,我们必须提供用空格分隔的值。
输出
Enter your name and age: Maria 27 Name: Maria Age: 27
这里,我们用空格分隔了两个输入,所以 Scanln()
可以同时获取这两个输入值。
Go fmt.Scanf()
fmt.Scanf()
函数与 Scanln()
函数类似。唯一的区别是 Scanf()
使用格式说明符来获取输入。例如,
// Program to take input from user using Scanf()
package main
import "fmt"
func main() {
var name string
var age int
// take name and age input using format specifier
fmt.Println("Enter your name and age:")
fmt.Scanf("%s %d", &name, &age)
fmt.Printf("Name: %s\nAge: %d", name, age)
}
输出
Enter your name and age: Maria 27 Name: Maria Age: 27
在上面的示例中,我们使用了 Scanln()
函数,通过各自的格式说明符获取 name 和 age 的两个输入值。
fmt.Scanf("%s %d", &name, &age)
这里,
%s
- 指定字符串输入,该输入被分配给 name 变量%d
- 指定整数输入,该输入被分配给 age 变量
与 Scanln()
一样,Scanf()
函数也通过空格分隔来获取值。当它遇到换行符时,Scanf()
会停止获取输入值。这就是为什么我们在同一行中输入值,并用空格分隔的原因。
在 Go 中,每种数据类型都有一个唯一的格式说明符,我们可以使用它们通过 Scanf()
来获取每种类型的值。
数据类型 | 格式说明符 |
---|---|
整型 | %d |
浮点数 | %g |
string | %s |
bool | %t |
获取浮点型和布尔型输入
package main
import "fmt"
func main() {
var temperature float32
var sunny bool
// take float input
fmt.Println("Enter the current temperature:")
fmt.Scanf("%g", &temperature)
// take boolean input
fmt.Println("Is the day sunny?")
fmt.Scanf("%t", &sunny)
fmt.Printf("Current temperature: %g\nIs the day Sunny? %t", temperature, sunny)
}
输出
Enter the current temperature: 31.2 Is the day sunny? true Current temperature: 31.2 Is the day Sunny? true
在上面的示例中,我们使用了 %g
来获取 float32
类型的值,并使用 %t
来获取 bool
类型的值。
输入值 31.2 被分配给 temperature 变量,true
被分配给 sunny。