编程笔记 Golang基础 013 格式化输入输出
- 一、格式化输出
-
-
-
- [1. fmt.Print系列函数](#1. fmt.Print系列函数)
- [2. Printf格式说明](#2. Printf格式说明)
- [3. 格式化布尔类型](#3. 格式化布尔类型)
-
-
- 二、格式化输入
-
-
-
- [1. fmt.Scan系列函数](#1. fmt.Scan系列函数)
- 注意事项
-
-
- 三、练习
- 小结
Go语言中的格式化输入和输出主要通过标准库
fmt
包来实现。主要是输出需要格式化。
一、格式化输出
1. fmt.Print系列函数
fmt.Println
: 输出内容并自动添加换行符。fmt.Printf
: 格式化的输出,允许按照指定的格式字符串打印变量值。fmt.Print
: 输出内容,不添加换行符。
go
package main
import "fmt"
func main() {
fmt.Println("Hello, World!") // 自动添加换行
fmt.Printf("Today is %s\n", "2024年2月21日") // 格式化输出日期
fmt.Print("No newline here") // 不会自动添加换行
}
2. Printf格式说明
Printf
的格式字符串中可以包含特殊的占位符(如 %d
, %s
, %v
, %T
等),它们会被相应类型的变量替换:
%d
: 整数%f
或%g
: 浮点数或科学计数法表示的数字%t
: 布尔类型%s
: 字符串%v
: 值的默认格式表示(根据不同类型显示)%#v
: 类似%v
,但输出结构体时会包含字段名%T
: 输出值的类型名称%q
: 双引号包裹的字符串字面量形式(适用于字符串和字符)%p
: 指针的内存地址
示例:
go
fmt.Printf("%d, %.2f, %t, %s, %#v, %T\n", 123, 3.14159, true, "Golang", struct{A int}{A: 42}, myVar)
3. 格式化布尔类型
布尔类型的值在使用 %t
格式化时,会输出 true
或 false
。
go
var isDone bool = false
fmt.Printf("Task is done? %t\n", isDone) // 输出:Task is done? false
二、格式化输入
1. fmt.Scan系列函数
fmt.Scan
: 从标准输入读取数据到一系列变量中,空格作为分隔符。fmt.Scanf
: 类似于 C 中的scanf
,接受一个格式字符串和对应变量列表,根据格式进行输入。fmt.Scanln
: 类似于Scanf
,但在读取一行后停止,并丢弃结尾的换行符。fmt.Sscan
: 从字符串中扫描。fmt.Sscanf
: 类似于Scanf
,但是针对字符串而不是标准输入。fmt.Sscanln
: 对字符串进行类似 Scanln 的操作。
示例:
go
var name string
var age int
fmt.Println("请输入姓名和年龄(用空格分隔)")
_, _ = fmt.Scan(&name, &age) // 从键盘输入读取姓名和年龄
// 或者使用 Sscanf 从已知字符串读取
input := "Alice 30"
fmt.Sscanf(input, "%s %d", &name, &age)
注意事项
- 使用格式化输入时务必注意安全性和有效性检查,确保输入的数据能够正确转换为预期类型。
- 在处理用户输入时,应尽可能避免直接将输入用于数据库查询等敏感操作,防止 SQL 注入等问题。
- Go 语言推荐使用
fmt.Scan
和fmt.Scanln
的变体fmt.Scanf
和fmt.Scanf
以及其配套的格式字符串进行精确控制输入解析。
三、练习
go
type user struct {
name string
}
func main() {
u := user{"guo"}
//Printf 格式化输出
fmt.Printf("% + v\n", u) //格式化输出结构
fmt.Printf("%#v\n", u) //输出值的 Go 语言表示方法
fmt.Printf("%T\n", u) //输出值的类型的 Go 语言表示
fmt.Printf("%t\n", true) //输出值的 true 或 false
fmt.Printf("%b\n", 1024) //二进制表示
fmt.Printf("%c\n", 11111111) //数值对应的 Unicode 编码字符
fmt.Printf("%d\n", 10) //十进制表示
fmt.Printf("%o\n", 8) //八进制表示
fmt.Printf("%q\n", 22) //转化为十六进制并附上单引号
fmt.Printf("%x\n", 1223) //十六进制表示,用a-f表示
fmt.Printf("%X\n", 1223) //十六进制表示,用A-F表示
fmt.Printf("%U\n", 1233) //Unicode表示
fmt.Printf("%b\n", 12.34) //无小数部分,两位指数的科学计数法6946802425218990p-49
fmt.Printf("%e\n", 12.345) //科学计数法,e表示
fmt.Printf("%E\n", 12.34455) //科学计数法,E表示
fmt.Printf("%f\n", 12.3456) //有小数部分,无指数部分
fmt.Printf("%g\n", 12.3456) //根据实际情况采用%e或%f输出
fmt.Printf("%G\n", 12.3456) //根据实际情况采用%E或%f输出
fmt.Printf("%s\n", "wqdew") //直接输出字符串或者[]byte
fmt.Printf("%q\n", "dedede") //双引号括起来的字符串
fmt.Printf("%x\n", "abczxc") //每个字节用两字节十六进制表示,a-f表示
fmt.Printf("%X\n", "asdzxc") //每个字节用两字节十六进制表示,A-F表示
fmt.Printf("%p\n", 0x123) //0x开头的十六进制数表示
}
小结
初学必备知识。实际开发中也会经常用到。