Go 语言 Printf 函数和格式化动词详解


在 Go 语言中,fmt 包提供了丰富的格式化输出函数,其中最常用的是 PrintfPrintf 函数支持多种格式化动词,用于将变量格式化为字符串,并输出到标准输出。下面详细介绍 Printf 函数的用法和常见的格式化动词。

1. Printf 函数

Printf 函数的基本用法如下:

fmt.Printf(format string, a ...interface{}) (n int, err error)
  • format:格式化字符串,其中包含格式化动词。
  • a:一个或多个需要格式化的变量。

示例

package main

import "fmt"

func main() {
    name := "Alice"
    age := 25
    fmt.Printf("Name: %s, Age: %d\n", name, age)
}

2. 常见的格式化动词

通用动词

  • %v:按默认格式输出变量的值。
  • %+v:输出结构体时,包含字段名。
  • %#v:输出变量的 Go 语法表示。
  • %T:输出变量的类型。
  • %%:输出百分号。

布尔值动词

  • %t:输出 truefalse

整数动词

  • %b:表示为二进制。
  • %c:表示为 Unicode 字符。
  • %d:表示为十进制。
  • %o:表示为八进制。
  • %O:表示为带前缀 0o 的八进制。
  • %x:表示为十六进制,使用小写字母 a-f。
  • %X:表示为十六进制,使用大写字母 A-F。
  • %U:表示为 Unicode 格式,带 U+ 前缀。

浮点数和复数动词

  • %e:科学计数法,使用小写 e。
  • %E:科学计数法,使用大写 E。
  • %f:有小数点而无指数。
  • %F:同 %f
  • %g:根据实际情况采用 %e%f 格式。
  • %G:根据实际情况采用 %E%F 格式。

字符串和字节切片动词

  • %s:字符串或字节切片表示。
  • %q:双引号括起来的字符串。
  • %x:每个字节用两字符十六进制表示。
  • %X:每个字节用两字符十六进制表示,使用大写字母。

指针动词

  • %p:表示为十六进制,并加上前缀 0x

3. 格式化动词的使用示例

package main

import "fmt"

func main() {
    // 通用动词
    fmt.Printf("%v\n", 123)               // 123
    fmt.Printf("%+v\n", struct{ X, Y int }{1, 2}) // {X:1 Y:2}
    fmt.Printf("%#v\n", struct{ X, Y int }{1, 2}) // struct { X int; Y int }{X:1, Y:2}
    fmt.Printf("%T\n", 123)               // int
    fmt.Printf("%%\n")                    // %

    // 布尔值动词
    fmt.Printf("%t\n", true)              // true

    // 整数动词
    fmt.Printf("%b\n", 255)               // 11111111
    fmt.Printf("%c\n", 65)                // A
    fmt.Printf("%d\n", 255)               // 255
    fmt.Printf("%o\n", 255)               // 377
    fmt.Printf("%O\n", 255)               // 0o377
    fmt.Printf("%x\n", 255)               // ff
    fmt.Printf("%X\n", 255)               // FF
    fmt.Printf("%U\n", '世')              // U+4E16

    // 浮点数和复数动词
    fmt.Printf("%e\n", 123.456)           // 1.234560e+02
    fmt.Printf("%E\n", 123.456)           // 1.234560E+02
    fmt.Printf("%f\n", 123.456)           // 123.456000
    fmt.Printf("%F\n", 123.456)           // 123.456000
    fmt.Printf("%g\n", 123.456)           // 123.456
    fmt.Printf("%G\n", 123.456)           // 123.456

    // 字符串和字节切片动词
    fmt.Printf("%s\n", "Hello, Go!")      // Hello, Go!
    fmt.Printf("%q\n", "Hello, Go!")      // "Hello, Go!"
    fmt.Printf("%x\n", "Hello")           // 48656c6c6f
    fmt.Printf("%X\n", "Hello")           // 48656C6C6F

    // 指针动词
    fmt.Printf("%p\n", &struct{ X, Y int }{1, 2}) // 0x<address>
}

4. 格式化动词的宽度和精度控制

可以在格式化动词中指定宽度和精度,用于控制输出的对齐和精度。

示例

package main

import "fmt"

func main() {
    n := 123.456

    // 宽度控制
    fmt.Printf("%10.2f\n", n) //  123.46  (宽度为10,小数点后保留2位)
    fmt.Printf("%10s\n", "Go") //         Go  (宽度为10,右对齐)

    // 精度控制
    fmt.Printf("%.2f\n", n)   // 123.46  (小数点后保留2位)
    fmt.Printf("%.5s\n", "Hello, Go!") // Hello  (字符串截取前5个字符)

    // 宽度和精度一起控制
    fmt.Printf("%10.5s\n", "Hello, Go!") //      Hello  (宽度为10,截取前5个字符)
}

总结

Go 语言的 Printf 函数及其格式化动词为格式化输出提供了丰富的功能。通过掌握各种格式化动词及其宽度和精度控制,可以灵活地将变量格式化为所需的字符串形式。


原文链接:codingdict.net