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缓冲channel和非缓冲channel的区别说明
Apr 25 Golang
Go 实现英尺和米的简单单位换算方式
Apr 29 Golang
解决golang在import自己的包报错的问题
Apr 29 Golang
解决Goland 同一个package中函数互相调用的问题
May 06 Golang
Golang 获取文件md5校验的方法以及效率对比
May 08 Golang
Go遍历struct,map,slice的实现
Jun 13 Golang
go select编译期的优化处理逻辑使用场景分析
Jun 28 Golang
Go语言基础函数基本用法及示例详解
Nov 17 Golang
golang定时器
Apr 14 Golang
Golang Elasticsearches 批量修改查询及发送MQ
Apr 19 Golang
Golang 链表的学习和使用
Apr 19 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取得一个类的属性和方法的实现代码
2011/05/22 PHP
用PHP书写安全的脚本代码
2012/02/05 PHP
php的SimpleXML方法读写XML接口文件实例解析
2014/06/16 PHP
Yii redis集合的基本使用教程
2020/06/14 PHP
将函数的实际参数转换成数组的方法
2010/01/25 Javascript
JavaScript 程序编码规范
2010/11/23 Javascript
GridView中获取被点击行中的DropDownList和TextBox中的值
2013/07/18 Javascript
node.js中的events.EventEmitter.listenerCount方法使用说明
2014/12/08 Javascript
Yii2使用Bootbox插件实现自定义弹窗
2015/04/02 Javascript
深入学习jQuery Validate表单验证(二)
2016/01/18 Javascript
解析Node.js异常处理中domain模块的使用方法
2016/02/16 Javascript
js计算时间差代码【包括计算,天,时,分,秒】
2016/04/26 Javascript
5个最顶级jQuery图表类库插件【jquery插件库】
2016/05/05 Javascript
jQuery ztree实现动态树形多选菜单
2016/08/12 Javascript
vue-cli3.0 脚手架搭建项目的过程详解
2018/10/19 Javascript
微信小程序修改checkbox的样式代码实例
2020/01/21 Javascript
JS co 函数库的含义和用法实例总结
2020/04/08 Javascript
[41:13]完美世界DOTA2联赛PWL S2 Forest vs Rebirth 第一场 11.20
2020/11/20 DOTA
python list 合并连接字符串的方法
2013/03/09 Python
解析Python编程中的包结构
2015/10/25 Python
python正则表达式之对号入座篇
2018/07/24 Python
Python装饰器简单用法实例小结
2018/12/03 Python
PyQt5响应回车事件的方法
2019/06/25 Python
opencv转换颜色空间更改图片背景
2019/08/20 Python
Pytorch之卷积层的使用详解
2019/12/31 Python
浅谈CSS3鼠标移入图片动态提示效果(transform)
2017/11/06 HTML / CSS
CSS3实现苹果手机解锁的字体闪亮效果示例
2021/01/05 HTML / CSS
Farfetch中文官网:奢侈品牌时尚购物平台
2020/03/15 全球购物
澳大利亚领先的内衣店:Bendon Lingerie澳大利亚
2020/05/15 全球购物
将一个数的从第5位开始的7个数取出,其余位置0
2016/05/26 面试题
资产评估专业学生的自我鉴定
2013/11/14 职场文书
企业法人代表证明书
2014/09/27 职场文书
优秀团支部申报材料
2014/12/26 职场文书
2015年迎新晚会策划书
2015/07/16 职场文书
先进个人主要事迹怎么写
2015/11/04 职场文书
Java后台生成图片的完整步骤
2021/08/04 Java/Android