二、格式化输出
在 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
标准库下,分别是 Scan
、Scanln
和 Scanf
。
这三个函数的返回值都是两个,分别是接收的值的个数(不是用户输入的个数,多个值使用空格隔开)以及错误信息。
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) } 复制代码
执行上述代码,输出结果如下:
在进行输入操作时,通常会将输入的内容保存到一个变量中,使用 Scan
函数的参数其实是内存地址,所以该函数的参数变量前要添加 &
寻址符,才可以将输入的内容保存到变量所指向的具体的内存地址中。
如果不添加 &
寻址符,直接以变量名作为 Scan
函数的参数,则获取到的只是变量的数据类型的默认值。
输入多个值时可以用空格隔开。
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) } 复制代码
执行上述代码,输出结果如下:
使用 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) } 复制代码
执行上述代码,输出结果如下:
注意 Scanf 接收多个值时,多个占位符使用空格隔开,如果使用其他字符比如逗号隔开则只会接收输入的第一个值。
其余变量会被赋值变量类型的默认值。