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 相关文章推荐
golang判断key是否在map中的代码
Apr 24 Golang
golang中实现给gif、png、jpeg图片添加文字水印
Apr 26 Golang
golang 如何用反射reflect操作结构体
Apr 28 Golang
解决Golang time.Parse和time.Format的时区问题
Apr 29 Golang
golang 比较浮点数的大小方式
May 02 Golang
goland设置颜色和字体的操作
May 05 Golang
GO语言异常处理分析 err接口及defer延迟
Apr 14 Golang
实现GO语言对数组切片去重
Apr 20 Golang
Go获取两个时区的时间差
Apr 20 Golang
深入理解 Golang 的字符串
May 04 Golang
Python测试框架pytest核心库pluggy详解
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
PHP5 字符串处理函数大全
2010/03/23 PHP
修改PHP的memory_limit限制的方法分享
2012/02/21 PHP
php去除html标记的原生函数详解
2015/01/27 PHP
Laravel使用PHPQRCODE实现生成带有LOGO的二维码图片功能示例
2017/07/07 PHP
ThinkPHP框架整合微信支付之Native 扫码支付模式一图文详解
2019/04/09 PHP
thinkphp5修改view到根目录实例方法
2019/07/02 PHP
jquery动画1.加载指示器
2012/08/24 Javascript
jquery给图片添加鼠标经过时的边框效果
2013/11/12 Javascript
jquery判断元素的子元素是否存在的示例代码
2014/02/04 Javascript
javascript中for/in循环及使用技巧
2015/09/01 Javascript
在WordPress中加入Google搜索功能的简单步骤讲解
2016/01/04 Javascript
javascript返回顶部的按钮实现方法
2016/01/09 Javascript
Bootstrap在线电子商务网站实战项目5
2016/10/14 Javascript
JavaScript数组复制详解
2017/02/02 Javascript
基于js 本地存储(详解)
2017/08/16 Javascript
vue项目中使用axios上传图片等文件操作
2017/11/02 Javascript
对类Vue的MVVM前端库的实现代码
2018/09/07 Javascript
JS实现的检验身份证格式并输出出生日期,年龄,性别,出生地示例
2019/05/17 Javascript
用vue设计一个日历表
2020/12/03 Vue.js
jQuery实现tab栏切换效果
2020/12/22 jQuery
深入理解 Python 中的多线程 新手必看
2016/11/20 Python
浅谈Python由__dict__和dir()引发的一些思考
2017/10/30 Python
对pandas处理json数据的方法详解
2019/02/08 Python
python抓取搜狗微信公众号文章
2019/04/01 Python
Python读取表格类型文件代码实例
2020/02/17 Python
tensorflow 动态获取 BatchSzie 的大小实例
2020/06/30 Python
CSS实现的一闪而过的图片闪光效果
2014/04/23 HTML / CSS
施华洛世奇水晶荷兰官方网站:SWAROVSKI荷兰
2017/05/12 全球购物
Lookfantastic日本官网:英国知名护肤、化妆品和头发护理购物网站
2018/04/21 全球购物
意大利在线购买隐形眼镜网站:VisionDirect.it
2019/03/18 全球购物
英国在线药房和在线药剂师:Chemist 4 U
2020/01/05 全球购物
作弊检讨书1000字
2014/02/01 职场文书
新闻编辑求职信
2014/07/13 职场文书
关于安全的广播稿
2014/10/23 职场文书
2015年宣传部个人工作总结
2015/05/14 职场文书
Python实现位图分割的效果
2021/11/20 Python