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

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


相关文章
|
8天前
|
存储 缓存 Go
go语言编程系列(五)
go语言编程系列(五)
|
8天前
|
搜索推荐 Java 编译器
go语言编程系列(四)
go语言编程系列(四)
|
8天前
|
存储 JSON 安全
go语言编程系列(七)
go语言编程系列(七)
|
8天前
|
存储 安全 编译器
go语言编程系列(六)
go语言编程系列(六)
|
8天前
|
自然语言处理 Java 测试技术
go语言编程系列(二)
go语言编程系列(二)
|
8天前
|
编译器 Go
go语言编程系列(三)
go语言编程系列(三)
|
8天前
|
安全 Java Go
Go语言编程系列(一)
Go语言编程系列(一)
|
27天前
|
Kubernetes Go Docker
在K8s编程中如何使用Go
一文带你了解在K8s编程中如何使用Go
44 3
|
2月前
|
Java 数据库连接 数据库
携手前行:在Java世界中深入挖掘Hibernate与JPA的协同效应
【8月更文挑战第31天】Java持久化API(JPA)是一种Java规范,为数据库数据持久化提供对象关系映射(ORM)方法。JPA定义了实体类与数据库表的映射及数据查询和事务控制方式,确保不同实现间的兼容性。Hibernate是JPA规范的一种实现,提供了二级缓存、延迟加载等丰富特性,提升应用性能和可维护性。通过结合JPA和Hibernate,开发者能编写符合规范且具有高度可移植性的代码,并利用Hibernate的额外功能优化数据持久化操作。
34 0
|
2月前
|
安全 Java 测试技术
Go 高性能编程心法探秘
文章深入探讨了Go语言在高性能编程中的各种技巧,包括常用数据结构的使用、内存管理、并发编程策略,以及如何通过减少锁的使用、有效利用sync包中的工具来优化程序性能。
14 0