二、格式化输出
在 Go 编程 | 连载 07 - 运算符与格式化输出 中讲到了格式化输出中的缺省占位符
和整型占位符
,本文中继续讲解格式化输出中的其他类型占位符以及格式化输入。
浮点占位符
浮点数占位符有两个,分别是:
%e
:表示科学计数形式浮点数%f
:表示十进制形式浮点数
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有引号
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
:字符串或者切片原样输出
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
标准库下,分别是 Scan
、Scanln
和 Scanf
。
这三个函数的返回值都是两个,分别是接收的值的个数(不是用户输入的个数,多个值使用空格隔开)以及错误信息。
代码语言: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
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 接收多个值时,多个占位符使用空格隔开,如果使用其他字符比如逗号隔开则只会接收输入的第一个值。
其余变量会被赋值变量类型的默认值。