Go 编程 | 连载 08 - 格式化输入输出

2022-09-26 21:21:56 浏览数 (1)

二、格式化输出

在 Go 编程 | 连载 07 - 运算符与格式化输出 中讲到了格式化输出中的缺省占位符整型占位符,本文中继续讲解格式化输出中的其他类型占位符以及格式化输入。

浮点占位符

浮点数占位符有两个,分别是:

  • %e:表示科学计数形式浮点数
  • %f:表示十进制形式浮点数
代码语言:javascript复制
func main() {

   var zulu float64 = 3.14
   yankee := 31415926.789654

   fmt.Printf("%en", yankee)
   fmt.Printf("%fn", zulu)
}

执行上述代码,输出结果如下:

代码语言:javascript复制
3.141593e 07
3.140000

字符占位符

  • %c:字符
  • %q:有引号的字符
  • %U:Unicode
  • %#U:Unicode有引号
代码语言:javascript复制
func main() {

   var xray = 'X'
   fmt.Printf("%cn", xray)

   var whiskey = 'W'
   fmt.Printf("%qn", whiskey)

   var alpah = 'A'
   fmt.Printf("%Un", alpah)

   var bravo = 'B'
   fmt.Printf("%#U", bravo)
}

执行上述代码,输出结果如下:

代码语言:javascript复制
X
'W'
U 0041
U 0042 'B'

字符串和切片占位符

  • %s:字符串或者切片原样输出
代码语言:javascript复制
func main() {

   foxtrot := []string{"stark", "hulk", "thor"}
   fmt.Printf("%sn", foxtrot)

   golf := "Hello, Go"
   fmt.Printf("%sn", golf)

   hotel := [3]int{1, 3, 5}
   fmt.Printf("%dn", hotel)
   fmt.Printf("%sn", hotel)
}

执行上述代码,输出结果如下:

代码语言:javascript复制
[stark hulk thor]
Hello, Go
[1 3 5]
[%!s(int=1) %!s(int=3) %!s(int=5)]

数组的格式化输出要使用 %d 占位符

三、格式化输入

Go 中的输入函数在 fmt 标准库下,分别是 ScanScanlnScanf

这三个函数的返回值都是两个,分别是接收的值的个数(不是用户输入的个数,多个值使用空格隔开)以及错误信息。

代码语言:javascript复制
func main() {

   var name string
   var age int
   var address string

   fmt.Println("输入名字:")
   n1, _ := fmt.Scan(&name)
   fmt.Printf("接收的值的个数为:%d,具体的值为:%sn", n1, name)
   fmt.Println("输入年龄和地址:")
   n2, _ := fmt.Scan(&age, &address)
   fmt.Printf("接收的值的个数为:%d,具体的值为:%d、%sn", n2, age, address)
}

执行上述代码,输出结果如下:

在进行输入操作时,通常会将输入的内容保存到一个变量中,使用 Scan 函数的参数其实是内存地址,所以该函数的参数变量前要添加 & 寻址符,才可以将输入的内容保存到变量所指向的具体的内存地址中。

如果不添加 & 寻址符,直接以变量名作为 Scan 函数的参数,则获取到的只是变量的数据类型的默认值。

输入多个值时可以用空格隔开。

Scan 与 Scanln 的区别

Scan 函数与 Scanln 函数的作用类似,区别是当要接收多个输入数据时,Scan 函数会等待全部数据输入完毕才会往下执行,而 Scanln 函数则不会等待,没有输入的数据会使用数据类型的默认值替代。

代码语言:javascript复制
func main() {

   var name string
   var age int
   var address string

   fmt.Println("使用 Scan 函数输入名字、年龄和地址:")
   n1, _ := fmt.Scan(&name, &age, &address)
   fmt.Printf("接收的值的个数为:%d,具体的值为:%s、%d、%sn", n1, name, age, address)
   fmt.Println("使用 Scanln 函数输入名字、年龄和地址:")
   n2, _ := fmt.Scanln(&name, &age, &address)
   fmt.Printf("接收的值的个数为:%d,具体的值为:%s、%d、%sn", n2, name, age, address)

}

执行上述代码,输出结果如下:

使用 Scan 函数输入多个值时,输入第一个之后点击回车不会继续往下执行,而是等待第二个第三个值输入,全部输入之后才会往下继续执行。

而到 Scanln 函数输入时,输入第一个值之后点击回车会继续往下执行代码,没有输入的值使用变量类型的默认值代替。

格式化输入 Scanf

代码语言:javascript复制
func main() {

   var name string
   var age int
   var address string

   fmt.Println("使用 Scanf 函数输入名字、年龄和地址:")
   // n1, _ := fmt.Scanf("%s, %d, %s", &name, &age, &address)
   n1, _ := fmt.Scanf("%s %d %s", &name, &age, &address)
   fmt.Printf("接收的值的个数为:%d,具体的值为:%s、%d、%sn", n1, name, age, address)

}

执行上述代码,输出结果如下:

注意 Scanf 接收多个值时,多个占位符使用空格隔开,如果使用其他字符比如逗号隔开则只会接收输入的第一个值。

其余变量会被赋值变量类型的默认值。

0 人点赞