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

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

二、格式化输出

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

浮点占位符

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

  • %e:表示科学计数形式浮点数
  • %f:表示十进制形式浮点数
func main() {
   var zulu float64 = 3.14
   yankee := 31415926.789654
   fmt.Printf("%e\n", yankee)
   fmt.Printf("%f\n", zulu)
}
复制代码

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

3.141593e+07
3.140000
复制代码

字符占位符

  • %c:字符
  • %q:有引号的字符
  • %U:Unicode
  • %#U:Unicode有引号
func main() {
   var xray = 'X'
   fmt.Printf("%c\n", xray)
   var whiskey = 'W'
   fmt.Printf("%q\n", whiskey)
   var alpah = 'A'
   fmt.Printf("%U\n", alpah)
   var bravo = 'B'
   fmt.Printf("%#U", bravo)
}
复制代码

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

X
'W'
U+0041
U+0042 'B'
复制代码

字符串和切片占位符

  • %s:字符串或者切片原样输出
func main() {
   foxtrot := []string{"stark", "hulk", "thor"}
   fmt.Printf("%s\n", foxtrot)
   golf := "Hello, Go"
   fmt.Printf("%s\n", golf)
   hotel := [3]int{1, 3, 5}
   fmt.Printf("%d\n", hotel)
   fmt.Printf("%s\n", hotel)
}
复制代码

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

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

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

三、格式化输入

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

6d5341a230c94ac9a79d1badd1205659_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png

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

func main() {
   var name string
   var age int
   var address string
   fmt.Println("输入名字:")
   n1, _ := fmt.Scan(&name)
   fmt.Printf("接收的值的个数为:%d,具体的值为:%s\n", n1, name)
   fmt.Println("输入年龄和地址:")
   n2, _ := fmt.Scan(&age, &address)
   fmt.Printf("接收的值的个数为:%d,具体的值为:%d、%s\n", n2, age, address)
}
复制代码

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

6990e1be2671439d98e0014ecbb5cd43_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png

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

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

a69f473612934b139ae064bce606f1d0_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png

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

Scan 与 Scanln 的区别

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

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、%s\n", n1, name, age, address)
   fmt.Println("使用 Scanln 函数输入名字、年龄和地址:")
   n2, _ := fmt.Scanln(&name, &age, &address)
   fmt.Printf("接收的值的个数为:%d,具体的值为:%s、%d、%s\n", n2, name, age, address)
}
复制代码

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

e54d765d09e24ab5b66d15145c8f8367_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png

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

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

格式化输入 Scanf

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、%s\n", n1, name, age, address)
}
复制代码

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

cf1ca0622a684ff99fe1eb31afd73b8d_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png

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

e8ac916241c540ff8916b3e1a3ef145f_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png

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


相关文章
|
7天前
|
数据采集 监控 Java
go语言编程学习
【11月更文挑战第3天】
23 7
|
13天前
|
Unix Linux Go
go进阶编程:Golang中的文件与文件夹操作指南
本文详细介绍了Golang中文件与文件夹的基本操作,包括读取、写入、创建、删除和遍历等。通过示例代码展示了如何使用`os`和`io/ioutil`包进行文件操作,并强调了错误处理、权限控制和路径问题的重要性。适合初学者和有经验的开发者参考。
|
21天前
|
Java 大数据 Go
Go语言:高效并发的编程新星
【10月更文挑战第21】Go语言:高效并发的编程新星
44 7
|
29天前
|
Go 数据处理 调度
Go语言中的并发模型:解锁高效并行编程的秘诀
本文将探讨Go语言中独特的并发模型及其在现代软件开发中的应用。通过深入分析 Goroutines 和 Channels,我们将揭示这一模型如何简化并行编程,提升应用性能,并改变开发者处理并发任务的方式。不同于传统多线程编程,Go的并发方法以其简洁性和高效性脱颖而出,为开发者提供了一种全新的编程范式。
|
1月前
|
并行计算 算法 搜索推荐
探索Go语言的高并发编程与性能优化
【10月更文挑战第10天】探索Go语言的高并发编程与性能优化
|
2月前
|
存储 缓存 Go
go语言编程系列(五)
go语言编程系列(五)
|
2月前
|
搜索推荐 Java 编译器
go语言编程系列(四)
go语言编程系列(四)
|
2月前
|
存储 JSON 安全
go语言编程系列(七)
go语言编程系列(七)
|
2月前
|
存储 安全 编译器
go语言编程系列(六)
go语言编程系列(六)
|
2月前
|
编译器 Go
go语言编程系列(三)
go语言编程系列(三)