设为首页 收藏本站
查看: 1240|回复: 0

[经验分享] Golang格式化小结

[复制链接]

尚未签到

发表于 2018-9-19 14:13:15 | 显示全部楼层 |阅读模式
  Golang的格式化使用了与c、python等语言类似的风格,但是更加丰富和通用。格式化函数在fmt包中,如:fmt.Printf,fmt.Fprintf,fmt.Sprintf,fmt.Println等等。其中Print,Fprint,Sprint都有一个对应d的ln函数版本和print版本(f指format,ln指line)。

Print版本
f版本
ln版本
输出
Print
Printf
Println
结果写到标准输出
Sprint
Sprintf
Sprintln
结果会以字符串形式返回
Fprint
Fprintf
Fprintln
输出结果会被写入到第一个参数提供的输出中  ln版本(Println,Fprintln,Sprintln),这些函数不接受格式字符串,每个参数都会使用一个缺省的格式字符串。而且ln版本还会在参数之间插入一个空格,并且在末尾添加一个换行符。而以ln结尾的格式化函数,则遵循Println的方式。Print版本只有当两边的操作数都不是字符串的时候,才会添加一个空格。f版本格式化函数需要指定格式化字符串参数,指定后续参数被如何格式化。各个参数的格式取决于"转换字符"(conversion character),形式为:百分号+字母,如,%d。按照惯例,以字母f结尾的格式化函数,如:log.Printf、fmt.Errorf都采用fmt.Printf的格式化标准。

1.格式字符串
  Golang的格式化字符串由普通字符和占位符组成,如:
  

  "abcd%+ #8.3[3]vefg"  

  其中abcd和efg是普通字符,其他部分是占位符。占位符以%开头,以动词结尾,格式如下:
  

%[旗标][宽度][.精度][arg索引]动词  

  其中,方括号中的内容是可缺省的。

1.1旗标
  旗标有以下几种:
  

+:  对于数值类型总是输出正负号;对于%q(%+q)保证只输出ASCII编码的字符  

  
-:  在右边进行宽度填充,而不是默认的左边。
  

  
空格:  对于数值类型的正数,保留一个空白的符号位(其它用法在动词部分说明)。
  

  
0:  用 0 进行宽度填充而不用空格,对于数值类型,符号将被移到所有 0 的前面。
  

  
#:  备用格式:为八进制添加前缀0(%#o);为十六进制添加前缀0x(%#x)或者0X(%#X);
  为%p(%#p)去掉前缀0x;。
  

  
其中 "0" 和 "-" 不能同时使用,优先使用 "-" 而忽略 "0"。
  

  格式化转换列表如下:

1.2宽度-精度
  宽度与精度的控制格式以Unicdoe码点为单位,这和C的printf不同,它以字节数为单位。两者或者其中之一均可以用'*'表示,此时它们的值会从下一个操作数中获取,该操作数类型必须为int。


  • 对数值而言,宽度为该数值占用区域的最小宽度;精度为小数点后的位数。但是对%g(%G),精度为数字的总和。
  • 对于大多数数值而言,宽度为输出的最小字符串,如果必要则会为已格式化的形式添加空格。
  • 对于字符串,精度为输出的最大字符数,必要时会截断字符串。
1.3占位符

格式
说明
%d
十进制数
%b,%o,%x
二进制、八进制、十六进制整数
%#b,%#o,%#x
二进制、八进制、十六进制整数,并显示相应前缀
%f,%g,%e
浮点数
%t
布尔值: true或者false
%c
相应Unicode码点表示的字符
%s
字符串
%U
显示Unicode码点
%q
带双引号的字符串"abc123"或者带单引号的字符'a','b'
%v
变量的自然形式(natural format)
%#v
使用Go语言类是的语法打印变量值
%T
变量的类型
%%
字面上的百分号标志(无操作数)
%p
十六进制表示指针地址,并使用前缀0x
1.4 格式化整数
  

    num := 022  fmt.Printf("%d\n", num)                       //十进制
  fmt.Printf("%b\n", num)                       //二进制
  fmt.Printf("%o\t %#o \n", num, num)           //八进制,显示0前缀
  fmt.Printf("%x\t %#x \t%#X\n", num, num, num) //十六进制,显示0x,0X前缀
  // output:
  // 18
  // 10010
  // 22       022
  // 12       0x12   0X12
  

1.5 浮点数
  浮点数格式化,可以使用%f、%g、%e,这三种打印形式都可以指定打印的宽度、控制打印的精度。

格式
说明
%e,%E
科学计数法,以10为底
%f,%F
普通小数格式
%g
根据情况选择 %e 或 %f 以产生更紧凑的(无末尾的 0)输出
%G
根据情况选择 %E 或 %F 以产生更紧凑的(无末尾的 0)输出  

    for x := 0; x < 12; x++ {  fmt.Printf(&quot;x = %2d e^x = %9.3f\t(%9.3[2]e)\t(%9.3[2]g)\n&quot;, x, math.Exp(float64(x)))
  }
  // output:          %9.3f    %9.3[2]e        %9.3[2]g
  // x =  0 e^x =     1.000  (1.000e+00)     (        1)
  // x =  1 e^x =     2.718  (2.718e+00)     (     2.72)
  // x =  2 e^x =     7.389  (7.389e+00)     (     7.39)
  // x =  3 e^x =    20.086  (2.009e+01)     (     20.1)
  // x =  4 e^x =    54.598  (5.460e+01)     (     54.6)
  // x =  5 e^x =   148.413  (1.484e+02)     (      148)
  // x =  6 e^x =   403.429  (4.034e+02)     (      403)
  // x =  7 e^x =  1096.633  (1.097e+03)     (  1.1e+03)
  // x =  8 e^x =  2980.958  (2.981e+03)     ( 2.98e+03)
  // x =  9 e^x =  8103.084  (8.103e+03)     (  8.1e+03)
  // x = 10 e^x = 22026.466  (2.203e+04)     (  2.2e+04)
  // x = 11 e^x = 59874.142  (5.987e+04)     ( 5.99e+04)
  

  注: %9.3f、%9.3[2]e或%9.3[2]g中9.3表示:宽度为9,小数点后保留3位,[2]表示重用Printf的第二个参数。宽度为该数值占用区域的最小宽度;精度为小数点后的位数。但是%g(%G),精度为数字的总和。

1.6 重用参数
  

fmt.Printf(&quot;%d %[1]o %#[1]o\n&quot;,0666)  

  通常Printf格式化参数包含多个%参数时,会包含同数量的操作数,%后的[1]告诉Printf函数再次使用第一个操作数

1.7 字符串
DSC0000.jpg

  

    for i, r := range &quot;Hello, 世界&quot; {  fmt.Printf(&quot;%d\t%q\t%d\n&quot;, i, r, r)
  }
  //output:
  // 0       'H'     72
  // 1       'e'     101
  // 2       'l'     108
  // 3       'l'     108
  // 4       'o'     111
  // 5       ','     44
  // 6       ' '     32
  // 7       '世'    19990
  // 10      '界'    30028
  

参考资料


  • Go官方文档
  • Go官方文档中文版
  • The Go Program Language
  • 基础知识 - Golang 中的格式化输入输出



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-594355-1-1.html 上篇帖子: Golang json用法详解(一) 下篇帖子: 随笔:Golang 时间Time
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表