Go中的fmt几种输出的区别和格式化方式

在日常使用fmt包的过程中,各种眼花缭乱的print是否让你莫名的不知所措呢,更让你茫然的是各种格式化的占位符。。简直就是噩梦。今天就让我们来征服格式化输出,做一个会输出的Goer。

fmt.Print有几个变种:

 
  1. Print: 输出到控制台,不接受任何格式化操作

  2. Println: 输出到控制台并换行

  3. Printf : 只可以打印出格式化的字符串。只可以直接输出字符串类型的变量(不可以输出别的类型)

  4. Sprintf:格式化并返回一个字符串而不带任何输出

  5. Fprintf:来格式化并输出到 io.Writers 而不是 os.Stdout

1. 通用的占位符

 
  1. %v 值的默认格式。

  2. %+v 类似%v,但输出结构体时会添加字段名

  3. %#v  相应值的Go语法表示

  4. %T 相应值的类型的Go语法表示

  5. %% 百分号,字面上的%,非占位符含义

默认格式%v下,对于不同的数据类型,底层会去调用默认的格式化方式:

 
  1. bool: %t

  2. int, int8 etc.: %d

  3. uint, uint8 etc.: %d, %x if printed with %#v

  4. float32, complex64, etc: %g

  5. string: %s

  6. chan: %p

  7. pointer: %p

如果是复杂对象的话,按照如下规则进行打印:

 
  1. struct: {field0 field1 ...}

  2. array, slice: [elem0 elem1 ...]

  3. maps: map[key1:value1 key2:value2]

  4. pointer to above: &{}, &[], &map[]

示例:

 
  1. package main

  2. import (

  3. "fmt"

  4. "strconv"

  5. )

  6. type User struct {

  7. Name string

  8. Age int

  9. }

  10. func (User) GetUser(user User) string{

  11. return user.Name + " " + strconv.Itoa(user.Age)

  12. }

  13. func main() {

  14. user := User{"xiaoming", 13}

  15. //Go默认形式

  16. fmt.Printf("%v",user)

  17. fmt.Println()

  18. //类型+值对象

  19. fmt.Printf("%#v",user)

  20. fmt.Println()

  21. //输出字段名和字段值形式

  22. fmt.Printf("%+v",user)

  23. fmt.Println()

  24. //值类型的Go语法表示形式

  25. fmt.Printf("%T",user)

  26. fmt.Println()

  27. fmt.Printf("%%")

  28. }

  29. 输出:

  30. {xiaoming 13}

  31. main.User{Name:"xiaoming", Age:13}

  32. {Name:xiaoming Age:13}

  33. main.User

  34. %

2. 常用类型

2.1 整数类型:

 
  1. %b 二进制表示

  2. %c 相应Unicode码点所表示的字符

  3. %d 十进制表示

  4. %o 八进制表示

  5. %q 单引号围绕的字符字面值,由Go语法安全地转义

  6. %x 十六进制表示,字母形式为小写 a-f

  7. %X 十六进制表示,字母形式为大写 A-F

  8. %U Unicode格式:123,等同于 "U+007B"

示例:

 
  1. package main

  2. import (

  3. "fmt"

  4. )

  5. func main() {

  6. fmt.Printf("%b",123)

  7. fmt.Println()

  8. fmt.Printf("%c",123)

  9. fmt.Println()

  10. fmt.Printf("%d",123)

  11. fmt.Println()

  12. fmt.Printf("%0",123)

  13. fmt.Println()

  14. fmt.Printf("%q",123)

  15. fmt.Println()

  16. fmt.Printf("%x",123)

  17. fmt.Println()

  18. fmt.Printf("%X",123)

  19. fmt.Println()

  20. fmt.Printf("%U",123)

  21. fmt.Println()

  22. }

  23. 输出:

  24. 1111011

  25. {

  26. 123

  27. %!(NOVERB)%!(EXTRA int=123)

  28. '{'

  29. 7b

  30. 7B

  31. U+007B

2.2 浮点数

 
  1. %b 无小数部分、二进制指数的科学计数法,如-123456p-78;

  2. 参见strconv.FormatFloat %e 科学计数法,如-1234.456e+78 %E

  3. 科学计数法,如-1234.456E+78 %f

  4. 有小数部分但无指数部分,如123.456 %F 等价于%f %g

  5. 根据实际情况采用%e或%f格式(以获得更简洁、准确的输出)

  6. %e 科学计数法,例如 -1234.456e+78

  7. %E 科学计数法,例如 -1234.456E+78

  8. %f 有小数点而无指数,例如 123.456

  9. %g 根据情况选择 %e 或 %f 以产生更紧凑的(无末尾的0)输出

  10. %G 根据情况选择 %E 或 %f 以产生更紧凑的(无末尾的0)输出

示例:

 
  1. package main

  2. import (

  3. "fmt"

  4. )

  5. func main() {

  6. fmt.Printf("%b",12675757563.5345432567)

  7. fmt.Println()

  8. fmt.Printf("%e",12675757563.5345432567)

  9. fmt.Println()

  10. fmt.Printf("%E",12675757563.5345432567)

  11. fmt.Println()

  12. fmt.Printf("%f",12675757563.5345432567)

  13. fmt.Println()

  14. fmt.Printf("%g",12675757563.5345432567)

  15. fmt.Println()

  16. fmt.Printf("%G",12675757563.5345432567)

  17. fmt.Println()

  18. }

  19. 输出:

  20. 6645747581470399p-19

  21. 1.267576e+10

  22. 1.267576E+10

  23. 12675757563.534544

  24. 1.2675757563534544e+10

  25. 1.2675757563534544E+10

2.3 布尔型

%t   true 或 false

2.4 字符串

 
  1. %s 字符串或切片的无解译字节

  2. %q 双引号围绕的字符串,由Go语法安全地转义

  3. %x 十六进制,小写字母,每字节两个字符

  4. %X 十六进制,大写字母,每字节两个字符

示例:

 
  1. package main

  2. import (

  3. "fmt"

  4. )

  5. func main() {

  6. //user := User{"xiaoming", 13}

  7. fmt.Printf("%s","I'm a girl")

  8. fmt.Println()

  9. fmt.Printf("%q","I'm a girl")

  10. fmt.Println()

  11. fmt.Printf("%x","I'm a girl")

  12. fmt.Println()

  13. fmt.Printf("%X","I'm a girl")

  14. fmt.Println()

  15. }

  16. 输出:

  17. I'm a girl

  18. "I'm a girl"

  19. 49276d2061206769726c

  20. 49276D2061206769726C

2.5 指针

%p     十六进制表示,前缀 0x

示例:

 
  1. package main

  2. import (

  3. "fmt"

  4. )

  5. func main() {

  6. a := 1

  7. b := &a

  8. fmt.Printf("%p",b)

  9. }

  10. 输出:

  11. 0xc00000c0a8

  12. 指针的地址

2.6 其他标志

 
  1. + 总打印数值的正负号;对于%q(%+q)保证只输出ASCII编码的字符。

  2. - 左对齐

  3. # 备用格式:为八进制添加前导 0(%#o),为十六进制添加前导 0x(%#x)或0X(%#X),为 %p(%#p)去掉前导 0x;对于 %q,若 strconv.CanBackquote 返回 true,就会打印原始(即反引号围绕的)字符串;如果是可打印字符,%U(%#U)会写出该字符的Unicode编码形式(如字符 x 会被打印成 U+0078 'x')。

  4. ' ' (空格)为数值中省略的正负号留出空白(% d);以十六进制(% x, % X)打印字符串或切片时,在字节之间用空格隔开

  5. 0 填充前导的0而非空格;对于数字,这会将填充移到正负号之后

示例:

 
  1. func main() {

  2. str := `duduud

  3. ffff

  4. nnnnn`

  5. fmt.Printf("%d",323)

  6. fmt.Println()

  7. fmt.Printf("%s",str)

  8. fmt.Println()

  9. fmt.Printf("%s %d","aaaa",10)

  10. fmt.Println()

  11. fmt.Printf("%s\n%d","aaaa",10)

  12. }

  13. 输出:

  14. 323

  15. duduud

  16. ffff

  17. nnnnn

  18. aaaa 10

  19. aaaa

  20. 10

2.7 格式化错误的提示

格式化错误.所有的错误都始于“%!”,有时紧跟着单个字符(占位符),并以小括号括住的描述结尾。

 
  1. func main() {

  2. fmt.Printf("%s",2) //%%!s(int=2)

  3. }

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值