跳到主要内容

Go语言输入

提示
  1. 输入函数:Go 语言使用 fmt.Scan()fmt.Scanln()fmt.Scanf() 函数从用户处接收输入,这些函数都定义在 fmt 包中。
  2. 输入处理细节fmt.Scan() 读取到空格为止的输入;fmt.Scanln() 读取到新行为止的输入;fmt.Scanf() 使用格式化标识符来读取特定格式的输入。
  3. 多重输入和格式化:可以使用这些函数一次读取多个输入,例如用空格分隔的不同数据类型的值。Scanf() 函数允许通过指定格式标识符(如 %d%s)来精确控制输入的读取。

在 Go 中,我们使用 scan() 函数从用户那里获取输入。例如,

package main
import "fmt"

func main() {
var name string

// 获取 name 的输入值
fmt.Print("请输入您的名字: ")
fmt.Scan(&name)

fmt.Printf("名字: %s", name)

}

输出

请输入您的名字: Rosie
名字: 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

// 获取 language 的输入值
fmt.Print("请输入你最喜欢的语言: ")
fmt.Scan(&language)

fmt.Printf("最喜欢的语言: %s", language)

}

输出

请输入你最喜欢的语言: Go 编程
最喜欢的语言: Go

在上面的例子中,我们提供了输入值 Go 编程。然而,我们只得到了 Go 作为输出。

这是因为 Scan() 函数只获取空格之前的输入值。

使用 Scan() 获取多个输入

在 Go 中,我们可以使用 Scan() 函数从用户那里获取多个输入。例如,

package main
import "fmt"

func main() {

// 创建变量
var name string
var age int

// 获取名字和年龄的输入
fmt.Println("请输入你的名字和年龄:")
fmt.Scan(&name, &age)

// 打印输入值
fmt.Printf("名字: %s\n年龄: %d", name, age)

}

输出

请输入你的名字和年龄:
Maria
27
名字: Maria
年龄: 27

在上面的例子中,我们创建了两个变量,name 和 age。注意我们使用了单个 Scan() 函数来为这两个变量获取输入值。

fmt.Scan(&name, &age)

这里,我们在两行不同的输入中提供了两个输入值 Maria27(输入值用换行符分隔)。在这种情况下,第一行的值被赋给 name 变量,第二行的值被赋给 age。

我们也可以在同一行中用空格分隔这两个值。

输出

请输入你的名字和年龄:
Maria 27
名字: Maria
年龄: 27

在这种情况下,空格之前的值被赋给第一个变量 name,空格之后的值被赋给第二个变量 age。

Go fmt.Scanln()

我们使用 Scanln() 函数获取到新行之前的输入值。当遇到新行时,它停止获取输入值。例如,

package main
import "fmt"

func main() {
var name string
var age int

// 获取名字和年龄的输入
fmt.Println("请输入你的名字和年龄:")
fmt.Scanln(&name, &age)

fmt.Printf("名字: %s\n年龄: %d", name, age)

}

输出

请输入你的名字和年龄:
Maria
名字: Maria
年龄: 0

在上面的例子中,我们使用了 Scanln() 函数来获取 name 和 age 的两个输入值。

fmt.Scanln(&name, &age)

然而,当我们在提供第一个值 Maria 后按下回车时,程序就退出了。这是因为 Scanln() 只接收到新行为止的输入值,所以当它遇到 Maria 后的回车时,就停止了输入。

如果我们想要输入 age 的值,我们必须提供用空格分隔的值。

输出

输入你的姓名和年龄:
Maria 27
姓名:Maria
年龄:27

这里,我们用空格分隔了两个输入,因此 Scanln() 可以接收两个输入值。

Go fmt.Scanf()

fmt.Scanf() 函数与 Scanln() 函数类似。唯一的区别是 Scanf() 使用格式说明符来获取输入。例如,

// 使用 Scanf() 从用户获取输入的程序

package main
import "fmt"

func main() {
var name string
var age int

// 使用格式说明符获取姓名和年龄输入
fmt.Println("输入你的姓名和年龄:")
fmt.Scanf("%s %d", &name, &age)

fmt.Printf("姓名:%s\n年龄:%d", name, age)
}

输出

输入你的姓名和年龄:
Maria 27
姓名:Maria
年龄:27

在上面的例子中,我们使用了 Scanln() 函数和相应的格式说明符来获取 name 和 age 的两个输入值。

fmt.Scanf("%s %d", &name, &age)

这里,

  • %s - 指定字符串输入,分配给 name 变量
  • %d - 指定整数输入,分配给 age 变量

就像 Scanln() 一样,Scanf() 函数接收用空格分隔的值。当遇到新行时,Scanf() 停止接收输入值。这就是为什么我们在同一行中给出了输入,用空格分隔。

在 Go 中,每种数据类型都有一个独特的格式说明符,我们可以使用它们来使用 Scanf() 获取每种类型的输入值。

数据类型格式说明符
整数%d
浮点数%g
字符串%s
布尔值%t

获取浮点数和布尔类型的输入

package main
import "fmt"

func main() {
var temperature float32
var sunny bool

// 获取浮点数输入
fmt.Println("输入当前温度:")
fmt.Scanf("%g", &temperature)

// 获取布尔值输入
fmt.Println("今天是晴天吗?")
fmt.Scanf("%t", &sunny)

fmt.Printf("当前温度:%g\n今天是晴天?%t", temperature, sunny)

}

输出

输入当前温度:
31.2
今天是晴天吗?
true
当前温度:31.2
今天是晴天?true

在上面的例子中,我们使用了 %g 来获取 float32 类型的输入,以及 %t 来获取 bool 类型的输入。

输入值 31.2 被分配给了 temperature 变量,true 被分配给了 sunny。