1. fmt 包初识

fmt 包,有关格式化输入输出的方法就两大类:ScanPrint ,分别在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包的使用的更多相关文章

  1. 『GoLang』函数

    函数介绍 Go语言函数基本组成包括: 关键字func 函数名 参数列表 返回值 函数体 返回语句 语法如下: func 函数名(参数列表) (返回值列表) { // 函数体 return } 除了ma ...

  2. 『GoLang』语法基础

    标识符 字母或下划线开头 之后只能出现数字.字母.下划线 大小写敏感 Go语言关键字 break default func interface select case defer go map str ...

  3. 『GoLang』包

    可见性规则 在Go语言中,标识符必须以一个大写字母开头,这样才可以被外部包的代码所使用,这被称为导出.标识符如果以小写字母开头,则对包外是不可见的,但是他们在整个包的内部是可见并且可用的.但是包名不管 ...

  4. 『Golang』MongoDB在Golang中的使用(mgo包)

    有关在Golang中使用mho进行MongoDB操作的最简单的例子.

  5. 『Golang』在Golang中使用json

    由于要开发一个小型的web应用,而web应用大部分都会使用json作为数据传输的格式,所以有了这篇文章. 包引用 import ( "encoding/json" "gi ...

  6. 『GoLang』string及其相关操作

    目录 1. 字符串简介 2. 字符串的拼接 3. 有关 string 的常用处理 3.1 strings 包 3.1.1 判断两个 utf-8 编码字符串是否相同 3.1.2 判断字符串 str 是否 ...

  7. 『Golang』Martini框架入门

    本文介绍golang中的优秀web开发框架martini! 序 Martini框架是使用Go语言作为开发语言的一个强力的快速构建模块化web应用与服务的开发框架.Martini是一个专门用来处理Web ...

  8. 『Golang』Go简介以及环境搭建

    简介 go语言是由Google进行维护的一个编程语言,发布自2009年.其以良好的编程风格.优秀的并发机制被广大的技术人员所接受. 使用go语言开发的优秀的产品: Docker gocode lime ...

  9. 『Golang』—— 标准库之 os

    Golang 的 os 库基本承袭 Unix 下 C 语言的用法 path 库: func Base(path string) string //取文件名,不含目录部分 func Dir(path s ...

随机推荐

  1. 心态崩了,我怎么知道实际生产环境的 B+ 树索引有多少层?

    Q:在实际生产环境中,InnoDB 中一棵 B+ 树索引一般有多少层?可以存放多少行数据? 关于这个问题最近好像在牛客上经常看到,感觉没啥意义,可能主要考察的是对 B+ 索引的理解吧.先上答案: A: ...

  2. C#多线程---Semaphore实现线程同步

    一.简介 Semaphore类限制可同时访问某一资源或资源池的线程数.线程通过调用 WaitOne方法将信号量减1,并通过调用 Release方法把信号量加1. 构造函数:public Semapho ...

  3. 学校acm比赛题

    这道题 用位运算必然简单  但是苦逼的是自己不熟练  那就 用本办法 输入一个十进制数  转换成二进制翻转 去掉高位的零 然后再转化为十进制 输出! 1 #include<stdio.h> ...

  4. Javascript - Vue - webpack + vue-cil

    cnpm(node package manager)和webpack模块 npm是运行在node.js环境下的包管理工具(先安装node.js,再通过命令 npm install npm -g 安装n ...

  5. 微信小程序学习笔记二 列表渲染 + 条件渲染

    1. 列表渲染 1.1 wx:for 在组件上使用wx:for控制属性绑定一个数组, 即可使用数组中各项的数据重复渲染该组件 默认数组的当前项的下标变量名默认为 index, 数组当前项的变量名默认为 ...

  6. new一个对象的时候,实际做了些什么

    当我们说new一个对象的时候,实际做了些什么, 可以参考下图理解

  7. Hutool中那些常用的工具类和方法

    Hutool中那些常用的工具类和方法 Hutool是一个Java工具包,它帮助我们简化每一行代码,避免重复造轮子.如果你有需要用到某些工具方法的时候,不妨在Hutool里面找找,可能就有.本文将对Hu ...

  8. 对抗生成网络GAN

      该方法常用于: 图像生成 图像修复,训练用了MSE+Global+Local数据,其中Global+Local判别式用于全局+局部一致性. 图像超分辨率重构   GAN的基本原理,主要包含两个网络 ...

  9. TCP通信的实现代码

    TCP通信 概念 传输控制协议(TCP,Transmission Control Protocol)是一种面向连接的.可靠的.基于字节流的传输层通信协议. 从百科定义中就可以看出,TCP通信的基本条件 ...

  10. mini-ndn0.5.0 安装教程 (避免踩坑)

    写在前面 首先需要确定一些配置,因为在安装的过程中需要编译一些内容,所以需要提前准备好. 本人之前ubuntu系统可能比较乱,在尝试很多次安装后,仍然失败,所以就直接重装了一下.说一下我自己的一些配置 ...