Go 语言中 20 个占位符的整理


Posted in Golang onOctober 16, 2021

一、概念

什么是占位符?你就从表面意思理解,就是占位置,只不过有很多不同种类的位置,而且这个位置不是谁都能坐,是有要求的,在程序层面用于格式化数据。

二、哪些函数支持

Go 语言中,标准包 fmt 有好多格式化的工具函数,函数名末尾通常以 f 结尾,列举如下:

  • fmt.Printf 格式化字符串并打印到终端(标准输出)。
  • fmt.Sprintf 格式化字符串并返回。
  • fmt.Sscanf 从字符串中解析占位符的对应位置数据。
  • fmt.Fscanf io.Reader 类型中读取数据并解析占位符的对应位置数据,用于读取文件、终端(标准输入)。
  • fmt.Fprintf 将格式化的字符串数据输出到 io.Writer 类型中,用于输出到文件。
  • fmt.Errorf 格式化方式创建一个错误类型消息。

这块没有重点展开讲解各个函数,只是简单罗列下,如果还不明白自行查一下,也可以问我。

下来看看本篇的重点...

三、占位符使用

占位符需要使用 % 符号表示,简单展示一个。

s := fmt.Sprintf("%s真帅", "老苗")
fmt.Println(s)

// 输出
老苗真帅

%s 标示字符串,将"老苗"字符串填充到 %s 位置。下来看看到底有哪些占位符?

四、普通占位符

先创建一个数据,作为打印的对象。

type Example struct {
 Content string
}

var data = Example{Content: "例子"}

1. %v、%+v、%#v

%v:获取数据的值,如果实现了 error 接口,仅表示错误消息。

fmt.Printf("%v", data) 
// 输出 
{例子}

fmt.Printf("%v", errors.New("我错了"))
// 输出
我错了

%+v:获取数据的值,如果结构体,会携带字段名。

fmt.Printf("%+v", data)
// 输出
{Content:例子}

%#v:获取数据的值,如果是结构体,会携带结构体名和字段名。

fmt.Printf("%#v", data)
// 输出
main.Example{Content:"例子"}

2. %T

获取数据类型

fmt.Printf("%T", data)
// 输出
main.Example

3. %%

字面上的一个百分号。

fmt.Printf("%%")
// 输出
%

五、布尔占位符

%t

true 或 false。

fmt.Printf("%t", true)
// 输出
true

六、整数占位符

1. %b

二进制。

fmt.Printf("%b", 4)
// 输出
100

2. %c

Unicode 码转字符。

fmt.Printf("%c", 0x82d7)
// 输出
苗

3. %d、%5d、%-5d、%05d

十进制整数表示。

fmt.Printf("%d,%d,%d", 10, 010, 0x10)
// 输出
10,8,16

三个数据: 10 十进制, 010 八进制, 0x10 十六进制

占位符还可以指定最小宽度,格式如下:

%5d
%-5d
%05d

例:

fmt.Printf("|%5d|%-5d|%05d|", 1, 1, 1)
// 输出
|    1|1    |00001|

4. %o、%#o

八进制表示

fmt.Printf("%o,%o,%o", 10, 010, 0x10)
// 输出
12,10,20

在很多开发语言中,0 打头的数字都表示八进制。通过 %#o 输出带 0 开头。

fmt.Printf("\n%#o\n", 10)
// 输出
012

5. %q

%c 类似,都是 Unicode 码转字符,只是结果多了单引号。

fmt.Printf("%q", 0x82d7)
// 输出
'苗'

汉字对应表: http://www.chi2ko.com/tool/CJK.htm

6. %x、%#x

十六进制表示,字母形式为小写 a-f, %#x 输出带 0x 开头。

fmt.Printf("%x, %#x", 13, 13)
// 输出
d, 0xd

7. %X、%#X

十六进制表示,字母形式为小写 A-F, %#X 输出带 0X 开头。

fmt.Printf("%X, %#X", 13, 13)
// 输出
D, 0XD

8. %U、%#U

%U:转化为 Unicode 格式规范。

fmt.Printf("%U", 0x82d7)
// 输出
U+82D7

%#U:转化为 Unicode 格式并带上对应的字符。

fmt.Printf("%#U", 0x82d7)
// 输出
U+82D7 '苗'

七、浮点数与复数

1. %b

浮点数转化为 2 的幂的科学计数法。

fmt.Printf("%b", 0.1)
// 输出
7205759403792794p-56

2. %e、%E

10 的幂的科学计数法。

fmt.Printf("%e", 10.2)
// 输出
1.020000e+01
fmt.Printf("%E", 10.2)
// 输出
1.020000E+01
区别: %e 与 %E 输出时的大小写之分。

3. %f、%.2f

浮点数, %.2f 表示保留 2 位小数, %f 默认保留 6 位, %f%F 等价。

保留的规则我现在还没有搞清楚,有时候符合四舍五入,有时候不符合,容我下来研究下,再告诉大家。

fmt.Printf("%f", 10.2)
// 输出
10.200000

fmt.Printf("%.2f|%.2f", 10.232, 10.235)
// 输出
10.23|10.23

也可以加入最小宽度,如下:

  • %9.2f 宽度最小为 9,包含小数位在内,精度为 2。
  • %9.f %9f 宽度最小为 9。

4. %g、%.3g

根据情况选择 %e%f ,但末尾去除 0。

%f 情况如下:

fmt.Printf("%g|%g", 10.20, 1.200000+3.400000i)
// 输出
10.2|(1.2+3.4i)

%e 情况如下:

fmt.Printf("%g|%g", 2e2, 2E2)
// 输出
200|200

%.3g 表示的不是小数保留 3 位,而是只保留 3 个数字。

fmt.Printf("%.3g", 12.34)
// 输出
12.3

思考:官网中 %g 和 %G 是有区别的,但我测试下来是等价的,可能我的测试有问题,我给出官网文档,如下:

%g %e for large exponents, %f otherwise. Precision is discussed below.
%G %E for large exponents, %F otherwise

八、字符串与字节切片

1. %s

字符串或字节切片

fmt.Printf("%s|%s", "老苗", []byte("嘿嘿嘿"))
// 输出
老苗|嘿嘿嘿

2. %q

有 Go 语言安全转义,双引号包裹。

fmt.Printf("%q", "老苗")
// 输出
"老苗"

3. %x、%X

十六进制, %x 小写字母 a - f, %X 大写字母 A - F。

fmt.Printf("%x|%X", "苗", "苗")
// 输出
e88b97|E88B97

九、指针

%p、%#p

地址,使用十六进制表示, %p 带 0x, %#p 不带。

num := 2
s := []int{1, 2}
fmt.Printf("%p|%p", &num, s)

// 输出
0xc00000a1d0|0xc00000a1e0

十、其它标记

1. +

打印数值的正负号,对于 %+q ,只输出 ASCII 编码的字符,如果非 ASCII 编码,则转成 Unicode 编码输出。

fmt.Printf("%+d|%+d", 2, -2)
// 输出
+2|-2

fmt.Printf("%+q|%+q", "miao","苗")
// 输出
"miao"|"\u82d7"

2. -

在右侧填充空格,这块就不举例了,使用如 %-5d ,浮点 %-9.2f 也支持,其它占位符大家可以有兴趣自行实验。

3.

  • 为八进制添加前导 0,上面已举例。
  • 为十六进制添加前导 0x 或 0X,上面已举例。
  • %#p去掉 0x。
  • %+q 打印字符串时使用反引号包裹。
fmt.Printf("%#q", "苗")
// 输出
`苗`

%#U 打印编码时,带上字符,上面已举例。

4. ' ' 空格

为正负号留出空白位置。

fmt.Printf("|% d|", 2)
// 输出
| 2|

5. 0

填充前导的 0,对于数字会移到正负号之后,非数字也可使用。

fmt.Printf("%05s", "a")
// 输出
0000a

fmt.Printf("%+05d", 1)
// 输出
+0001

精度截断字符串

给字符串使用精度,用来截断字符串。

fmt.Printf("%.2s", "abc")
// 输出
ab

总结
占位符区分大小写,总共讲了 20 个,但占位符相关的知识点其实还有,我暂时也不想研究了,因为在项目中也很难使用到。

如果有兴趣的,前往官网。地址: https://pkg.go.dev/fmt

到此这篇关于Go 语言中 20 个占位符的整理的文章就介绍到这了,更多相关Go 语言中 20 个占位符内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Golang 相关文章推荐
go语言求任意类型切片的长度操作
Apr 26 Golang
彻底理解golang中什么是nil
Apr 29 Golang
浅谈Golang 嵌套 interface 的赋值问题
Apr 29 Golang
Golang中interface{}转为数组的操作
Apr 30 Golang
golang 实现并发求和
May 08 Golang
GoLang中生成UUID唯一标识的实现
May 08 Golang
go语言中http超时引发的事故解决
Jun 02 Golang
golang 实用库gotable的具体使用
Jul 01 Golang
Golang gRPC HTTP协议转换示例
Jun 16 Golang
Go语言测试库testify使用学习
Jul 23 Golang
在ubuntu下安装go开发环境的全过程
Aug 05 Golang
Go语言编译原理之源码调试
Aug 05 Golang
Golang中channel的原理解读(推荐)
Oct 16 #Golang
Go语言并发编程 sync.Once
Oct 16 #Golang
Go 通过结构struct实现接口interface的问题
Oct 05 #Golang
golang实现一个简单的websocket聊天室功能
深入理解go slice结构
Sep 15 #Golang
Golang表示枚举类型的详细讲解
golang 语言中错误处理机制
Aug 30 #Golang
You might like
php生成WAP页面
2006/10/09 PHP
利用PHP+JS实现搜索自动提示(实例)
2013/06/09 PHP
codeigniter使用技巧批量插入数据实例方法分享
2013/12/31 PHP
PHP超全局数组(Superglobals)介绍
2015/07/01 PHP
Thinkphp批量更新数据的方法汇总
2016/06/29 PHP
PHP批量获取网页中所有固定种子链接的方法
2016/11/18 PHP
php使用socket调用http和smtp协议实例小结
2019/07/26 PHP
通用于ie和firefox的函数 GetCurrentStyle (obj, prop)
2006/12/27 Javascript
wordpress之js库集合研究介绍
2007/08/17 Javascript
使用jQuery避免鼠标双击的解决方案
2013/08/21 Javascript
javascript/jquery获取地址栏url参数的方法
2014/03/05 Javascript
js对象继承之原型链继承实例
2015/01/10 Javascript
简易的投票系统以及js刷票思路和方法
2015/04/07 Javascript
Javascript中replace()小结
2015/09/30 Javascript
js实现目录链接,内容跟着目录滚动显示的简单实例
2016/10/15 Javascript
浅谈Vuejs中nextTick()异步更新队列源码解析
2017/12/31 Javascript
详解jQuery如何实现模糊搜索
2019/05/10 jQuery
JQuery事件委托原理与用法实例分析
2019/05/13 jQuery
JQuery animate动画应用示例
2019/05/14 jQuery
vue + elementUI实现省市县三级联动的方法示例
2019/10/29 Javascript
selenium+java中用js来完成日期的修改
2019/10/31 Javascript
通过JS判断网页是否为手机打开
2020/10/28 Javascript
python 机器学习之支持向量机非线性回归SVR模型
2019/06/26 Python
python设置随机种子实例讲解
2019/09/12 Python
解决Pytorch训练过程中loss不下降的问题
2020/01/02 Python
viagogo法国票务平台:演唱会、体育比赛、戏剧门票
2017/03/27 全球购物
Parts Express:音频、视频和扬声器的第一来源
2017/04/25 全球购物
英国游戏机和游戏购物网站:365games.co.uk
2018/06/18 全球购物
Three Graces London官网:英国奢侈品牌
2021/03/18 全球购物
意大利时尚奢侈品店:D’Aniello Boutique
2021/01/19 全球购物
保险专业大专生求职信
2013/10/26 职场文书
2014年母亲节寄语
2014/05/07 职场文书
农民工讨薪标语
2014/06/26 职场文书
灵山大佛导游词
2015/02/04 职场文书
MySQL不使用order by实现排名的三种思路总结
2021/06/02 MySQL
如何利用python实现Simhash算法
2022/06/28 Python