『GoLang』fmt包的使用
1. fmt 包初识
在 fmt 包,有关格式化输入输出的方法就两大类:Scan 和 Print ,分别在scan.go 和 print.go 文件中。
print.go文件中定义了如下函数:
func Printf(format string,  a ...interface{}) (n int,  err error)
func Fprintf(w io.Writer,  format string,  a ...interface{}) (n int,  err error)
func Sprintf(format string,  a ...interface{}) string
func Print(a ...interface{}) (n int,  err error)
func Fprint(w io.Writer,  a ...interface{}) (n int,  err error)
func Sprint(a ...interface{}) string
func Println(a ...interface{}) (n int,  err error)
func Fprintln(w io.Writer,  a ...interface{}) (n int,  err error)
func Sprintln(a ...interface{}) string
这9个函数,按照两个维度来说明,基本上可以说明白了。
- 如果把Print理解为核心关键字,那么后面跟的后缀有"f"和"ln"以及"",着重的是输出内容的最终结果;如果后缀是"f", 则指定了format 如果后缀是"ln", 则有换行符。
Println、Fprintln、Sprintln  输出内容时会加上换行符;
Print、Fprint、Sprint        输出内容时不加上换行符;
Printf、Fprintf、Sprintf     按照指定格式化文本输出内容。
- 如果把Print理解为核心关键字,那么前面的前缀有"F"和"S"以及"",着重的是输出内容的目标(终端);如果前缀是"F", 则指定了io.Writer如果前缀是"S", 则是输出到字符串
Print、Printf、Println      输出内容到标准输出os.Stdout;
Fprint、Fprintf、Fprintln   输出内容到指定的io.Writer;
Sprint、Sprintf、Sprintln   输出内容到字符串。
scan.go文件中定义了如下函数:
func Scanf(format string,  a ...interface{}) (n int,  err error)
func Fscanf(r io.Reader,  format string,  a ...interface{}) (n int,  err error)
func Sscanf(str string,  format string,  a ...interface{}) (n int,  err error)
func Scan(a ...interface{}) (n int,  err error)
func Fscan(r io.Reader,  a ...interface{}) (n int,  err error)
func Sscan(str string,  a ...interface{}) (n int,  err error)
func Scanln(a ...interface{}) (n int,  err error)
func Fscanln(r io.Reader,  a ...interface{}) (n int,  err error)
func Sscanln(str string,  a ...interface{}) (n int,  err error)
这9个函数可以扫描格式化文本以生成值。同样也可以按照两个维度来说明。
- 如果把"Scan"理解为核心关键字,那么后面跟的后缀有"f"和"ln"以及"",着重的是输入内容的结果;如果后缀是"f", 则指定了format 如果后缀是"ln", 则有换行符
Scanln、Fscanln、Sscanln    读取到换行时停止,并要求一次提供一行所有条目;
Scan、Fscan、Sscan          读取内容时不关注换行;
Scanf、Fscanf、Sscanf       根据格式化文本读取。
- 如果把"Scan"理解为核心关键字,那么前面的前缀有"F"和"S"以及"",着重的是输入内容的来源(终端);如果前缀是"F", 则指定了io.Reader如果前缀是"S", 则是从字符串读取
Scan、Scanf、Scanln     从标准输入os.Stdin读取文本;
Fscan、Fscanf、Fscanln  从指定的io.Reader接口读取文本;
Sscan、Sscanf、Sscanln  从一个参数字符串读取文本。
2. 格式化 verb 应用
2.1 通用
| 符号 | 含义 | 
|---|---|
| %v | 值的默认格式表示。当输出结构体时,扩展标志( %+v)会添加字段名 | 
| %#v | 值的Go语法表示 | 
| %T | 值的类型的Go语法表示 | 
| %% | 百分号 | 
type Person struct {
    Name string
}
func main() {
    person := Person{Name: "亚索"}
    fmt.Printf("%v", person)  //{亚索}
    fmt.Printf("%+v", person) //{Name:亚索}
    fmt.Printf("%#v", person) //main.Person{Name:"亚索"}
    fmt.Printf("%T", person)  //main.Person
    fmt.Printf("%%")          //%
}
2.2 布尔值
| 符号 | 含义 | 
|---|---|
| %t | 单词true或false | 
func main() {
    fmt.Printf("%t", true)  // true
    fmt.Printf("%t", false) //false
}
2.3 整数
| 符号 | 含义 | 
|---|---|
| %b | 表示为二进制 | 
| %c | 该值对应的unicode码值 | 
| %d | 表示为十进制 | 
| %o | 表示为八进制 | 
| %q | 该值对应的单引号括起来的go语法字符字面值,必要时会采用安全的转义表示 | 
| %x | 表示为十六进制,使用a-f | 
| %X | 表示为十六进制,使用A-F | 
| %U | 表示为Unicode格式:U+1234,等价于"U+%04X" | 
func main() {
    fmt.Printf("%b", 5)      // 101
    fmt.Printf("%c", 0x4E2d) // 中
    fmt.Printf("%d", 0x12)   // 18
    fmt.Printf("%o", 10)     // 12
    fmt.Printf("%q", 0x4E2d) // '中'
    fmt.Printf("%x", 13)     // d
    fmt.Printf("%X", 13)     // D
    fmt.Printf("%U", 0x4E2d) // U+4E2D
}
2.4 浮点数与复数
| 符号 | 含义 | 
|---|---|
| %b | 无小数部分、二进制指数的科学计数法,如-123456p-78;参见strconv.FormatFloat | 
| %e | 科学计数法,如-1234.456e+78 | 
| %E | 科学计数法,如-1234.456E+78 | 
| %f | 有小数部分但无指数部分,如123.456 | 
| %F | 等价于%f | 
| %g | 根据实际情况采用%e或%f格式(以获得更简洁、准确的输出) | 
| %G | 根据实际情况采用%E或%F格式(以获得更简洁、准确的输出) | 
func main() {
    fmt.Printf("%b", 10.20) // 5742089524897382p-49
    fmt.Printf("%e", 10.20) // 1.020000e+01
    fmt.Printf("%E", 10.20) // 1.020000E+01
    fmt.Printf("%f", 10.20) // 10.200000
    fmt.Printf("%F", 10.20) // 10.200000
    fmt.Printf("%g", 10.20) // 10.2
    fmt.Printf("%G", 10.20) // 10.2
}
2.5 字符串和 []byte
| 符号 | 含义 | 
|---|---|
| %s | 直接输出字符串或者[]byte | 
| %q | 该值对应的双引号括起来的Go语法字符串字面值,必要时会采用安全的转义表示 | 
| %x | 每个字节用两字符十六进制数表示(使用a-f) | 
| %X | 每个字节用两字符十六进制数表示(使用A-F) | 
func main() {
    fmt.Printf("%s", []byte("Go语言"))    // Go语言
    fmt.Printf("%q", "Go语言")            // "Go语言"
    fmt.Printf("%x", "golang")            // 676f6c616e67
    fmt.Printf("%X", "golang")            // 676F6C616E67
}
2.6 指针
| 符号 | 含义 | 
|---|---|
| %p | 表示为十六进制,并加上前导的0x | 
type Person struct {
    Name string
}
func main() {
    person := Person{Name: "瑞雯"}
    fmt.Printf("%p",&person) // 0xc0000881e0
}
2.7 其他 flag
| 符号 | 含义 | 
|---|---|
| + | 总是输出数值的正负号;对%q(%+q)会生成全部是ASCII字符的输出(通过转义) | 
| - | 在输出右边填充空白而不是默认的左边(即从默认的右对齐切换为左对齐) | 
| # | 切换格式:八进制数前加0(%#o),十六进制数前加0x(%#x)或0X(%#X),指针去掉前面的0x(%#p); 对%q(%#q),如果strconv.CanBackquote返回真会输出反引号括起来的未转义字符串; 对%U(%#U),如果字符是可打印的,会在输出Unicode格式、空格、单引号括起来的Go字面值; | 
| 0 | 使用0而不是空格填充,对于数值类型会把填充的0放在正负号后面; | 
verb会忽略不支持的旗标(flag)
type Person struct {
    Name string
}
func main() {
    person := Person{Name: "菲奥娜"}
    fmt.Printf("%+q", "中文")    // "\u4e2d\u6587"
    fmt.Printf("%#o", 46)        // 056
    fmt.Printf("%#x", 46)        // 0x2e
    fmt.Printf("%#p", &person)   // c0000481f0
    fmt.Printf("%#q", '中')      // '中'
    fmt.Printf("%#U", '中')      // U+4E2D '中'
    fmt.Printf("% d", 16)       //  16
    fmt.Printf("% x","abc")     // 61 62 63
}
2.8 有效位输出
默认的 %f 输出格式是小数点后要有6位有效数字,不够补后置零
func main() {
    fmt.Printf("%f\n", 0.31415926) // 0.314159
    fmt.Printf("%f\n", 3.1415926)  // 3.141593
    fmt.Printf("%f\n", 314.15926)  // 314.159260
    fmt.Printf("%f\n", 3141.5926)  // 3141.592600
    fmt.Printf("%f\n", 3141.)      // 3141.000000
}
Go语言中对宽度和有效数字的限定:%[宽度].[精度]f
- 宽度是指整个浮点数的宽度,是指整数位数+小数位数 + 1(小数点算一位),指定的宽度小于实际宽度或不指定宽度时,以实际宽度展示;当指定宽度大于实际宽度时,按照对齐方式和填充字符来填充
- 精度是指小数点后的数字个数,默认是6位,指定后按照指定的精度来,不足补后置零
func main() {
    fmt.Printf("%3.3f\n", 314.15926) // 314.159
    fmt.Printf("%8.3f\n", 314.15926) //  314.159
    fmt.Printf("%8.f\n", 314.15926)  //      314
    fmt.Printf("%4.0f\n", 314.15926) //  314
    fmt.Printf("%4.6f\n", 314.15926) // 314.159260
}
对于整数 %d,宽度和精度都表示整数数字个数,只是在指定宽度超过实际宽度时,指定精度会补前置零,指定宽度会按照实际宽度输出
func main() {
    fmt.Printf("%d\n", 12345)    // 12345
    fmt.Printf("%3d\n", 12345)   // 12345
    fmt.Printf("%.3d\n", 12345)  // 12345
    fmt.Printf("%3.3d\n", 12345) // 12345
    fmt.Printf("%6d\n", 12345)   //  12345
    fmt.Printf("%.6d\n", 12345)  // 012345
    fmt.Printf("%6.6d\n", 12345) // 012345
    fmt.Printf("%8.7d\n", 12345) //  0012345
}
指定精度会至少要显示出这么多宽度的数字,所以不足时补零到足够为止,这时候,如果指定的宽度大于精度,那么剩余的填充符就不一定是0了,要看实际设定是什么,默认是左边补空格
对于 %e、%g这些,类似,遇到百度。
『GoLang』fmt包的使用的更多相关文章
- 『GoLang』函数
		函数介绍 Go语言函数基本组成包括: 关键字func 函数名 参数列表 返回值 函数体 返回语句 语法如下: func 函数名(参数列表) (返回值列表) { // 函数体 return } 除了ma ... 
- 『GoLang』语法基础
		标识符 字母或下划线开头 之后只能出现数字.字母.下划线 大小写敏感 Go语言关键字 break default func interface select case defer go map str ... 
- 『GoLang』包
		可见性规则 在Go语言中,标识符必须以一个大写字母开头,这样才可以被外部包的代码所使用,这被称为导出.标识符如果以小写字母开头,则对包外是不可见的,但是他们在整个包的内部是可见并且可用的.但是包名不管 ... 
- 『Golang』MongoDB在Golang中的使用(mgo包)
		有关在Golang中使用mho进行MongoDB操作的最简单的例子. 
- 『Golang』在Golang中使用json
		由于要开发一个小型的web应用,而web应用大部分都会使用json作为数据传输的格式,所以有了这篇文章. 包引用 import ( "encoding/json" "gi ... 
- 『GoLang』string及其相关操作
		目录 1. 字符串简介 2. 字符串的拼接 3. 有关 string 的常用处理 3.1 strings 包 3.1.1 判断两个 utf-8 编码字符串是否相同 3.1.2 判断字符串 str 是否 ... 
- 『Golang』Martini框架入门
		本文介绍golang中的优秀web开发框架martini! 序 Martini框架是使用Go语言作为开发语言的一个强力的快速构建模块化web应用与服务的开发框架.Martini是一个专门用来处理Web ... 
- 『Golang』Go简介以及环境搭建
		简介 go语言是由Google进行维护的一个编程语言,发布自2009年.其以良好的编程风格.优秀的并发机制被广大的技术人员所接受. 使用go语言开发的优秀的产品: Docker gocode lime ... 
- 『Golang』—— 标准库之 os
		Golang 的 os 库基本承袭 Unix 下 C 语言的用法 path 库: func Base(path string) string //取文件名,不含目录部分 func Dir(path s ... 
随机推荐
- Set重写hashCode和equals方法实现引用对象去重
			运作原理: 首先判断hashCode是否相同,如果不同,直接判定为两个不同的对象.如果hashCode相同,再去比较equals是否一样,如果一样,则为同一个对象.如果不一样,则是两个不同对象. 那么 ... 
- 聊一聊中台和DDD(领域驱动设计)
			本次分享价值:本次分享主要针对中台.微服务和领域模型的理念.本质及其构建方法论进行探讨.对领域分析的价值所在就是寻求"千变万化"中相对的"稳定性.第一性",然后 ... 
- vue 引入 leaflet1.4.0
			安装leaflet cnpm install leaflet@~1.4.0 --save // 在main.js 中设置如下 //引入样式文件 import 'leaflet/dist/leaflet ... 
- 演练:创建和使用自己的动态链接库 (C++)
			此分布演练演示如何使用 Visual Studio IDE 通过 Microsoft C++ (MSVC) 编写自己的动态链接库 (DLL). 然后,该演练演示如何从其他 C++ 应用中使用 DLL. ... 
- C# 线程同步的多种方式
			实际应用中多个线程往往需要共享数据,因此必须使用同步技术,确保一次只有一个线程访问和改变共享数据.同步又分为进程内部线程的同步以及进程之间线程的同步. 进程内部线程同步: 1. lock : 使用比较 ... 
- redis并发锁
			1.应对并发场景 避免操作数据不一致 将对redis加锁 2.考虑到异常状况无法释放锁,导致死锁 将代码块进行try-catch处理 3.考虑try时宕机依然导致死锁 对锁添加时效性,添加过期时间 4 ... 
- Vue.JS快速上手(组件生命周期)
			一.什么是组件 组成网页独立功能基本单元(片段), 复用.维护.性能, Vue.js中的组件就是一个Vue的实例,Vue中的组件包含data/methods/computed. 一个Vue.js的应用 ... 
- WIN10 64bit + QT5.10.0(MinGW3.5.0) + OpenCV3.4.1 无痛安装、配置
			安装QT和配置MinGW 官方下载qt-opensource-windows-x86-5.10.0.exe 正常步骤安装QT5.10.0,安装过程选择自带的MinGW3.5.0编译器即可. 打开QtC ... 
- 【开发工具】Postman保姆级入门教程
			目录 一.简单使用 1. 创建命名空间 2. 创建新集合 3. 按模块整理接口 二.使用环境变量 1. 创建环境与环境变量 2. 使用环境变量 3. 登录后自动更新环境变量 转载请注明出处 一.简单使 ... 
- SpringBoot快速集成SpringBootAdmin管控台监控服务
			SpringBootAdmin是一个针对 Spring Boot 的 Actuator 接口进行 UI 美化封装的监控工具,它可以在列表中浏览所有被监控 spring-boot 项目的基本信息.详细的 ... 
