在线文档  >   Golang练习   >   字符串格式化

Go语言提供了很好的支持,用于按照 printf 的传统格式化字符串。下面是一些常见的字符串格式化任务的示例。

package main

import (
    "fmt"
    "os"
)

type point struct {
    x, y int
}

func main() {

    // Go语言提供了几个打印“动词”,用于格式化通用的Go值。
    // 例如,这里打印了一个`point`结构体的实例。
    p := point{1, 2}
    fmt.Printf("struct1: %v\n", p)

    // 如果值是结构体,则`%+v` 将包括结构体的字段名。
    fmt.Printf("struct2: %+v\n", p)

    // `%#v` 会打印出一个值的Go语法表示法,即生成该值的源代码片段。
    fmt.Printf("struct3: %#v\n", p)

    // 要打印值的类型,请使用`%T`。
    fmt.Printf("type: %T\n", p)

    // 格式化布尔值非常简单。
    fmt.Printf("bool: %t\n", true)

    // 有许多选项可用于格式化整数。
    // 使用'%d'进行标准的十进制格式化。
    fmt.Printf("int: %d\n", 123)

    // 这将打印出一个二进制表示。
    fmt.Printf("bin: %b\n", 14)

    // 这将打印与给定整数对应的字符。
    fmt.Printf("char: %c\n", 33)

    // `%x` 提供十六进制编码。
    fmt.Printf("hex: %x\n", 456)

    // 还有几个浮点数格式化选项。对于基本的十进制格式化,请使用`%f`。
    fmt.Printf("float1: %f\n", 78.9)

    // `%e` 和 `%E` 以稍微不同的科学计数法格式化浮点数。
    fmt.Printf("float2: %e\n", 123400000.0)
    fmt.Printf("float3: %E\n", 123400000.0)

    // 用于基本字符串打印,请使用`%s`。
    fmt.Printf("str1: %s\n", "\"string\"")

    // 要像Go源代码中一样将字符串双引号括起来,请使用`%q`。
    fmt.Printf("str2: %q\n", "\"string\"")

    // 与之前的整数一样,`%x` 在基数16中呈现字符串,并且每个输入字节具有两个输出字符。
    fmt.Printf("str3: %x\n", "hex this")

    // 要打印指针的表示形式,请使用`%p`。
    fmt.Printf("pointer: %p\n", &p)

    // 格式化数字时,您通常会想要控制结果数字的宽度和精度。
    // 要指定整数的宽度,请在动词后面使用数字。
    // 默认情况下,结果将右对齐并填充空格。
    fmt.Printf("width1: |%6d|%6d|\n", 12, 345)

    // 您还可以指定打印的浮点数的宽度,但通常您也希望同时使用width.precision语法限制小数精度。
    fmt.Printf("width2: |%6.2f|%6.2f|\n", 1.2, 3.45)

    // 要左对齐,请使用“ - ”标志。
    fmt.Printf("width3: |%-6.2f|%-6.2f|\n", 1.2, 3.45)

    // 格式化字符串时,您可能还希望控制宽度,特别是确保它们在类似表格的输出中对齐。 
    //请使用基本右对齐宽度。
    fmt.Printf("width4: |%6s|%6s|\n", "foo", "b")

    // 像数字一样使用“ - ”标志来左对齐。
    fmt.Printf("width5: |%-6s|%-6s|\n", "foo", "b")

    // 到目前为止,我们已经看到`Printf`,它将格式化的字符串打印到`os.Stdout`。
    // `Sprintf` 格式化并返回一个字符串,而不将其打印在任何地方。
    s := fmt.Sprintf("sprintf: a %s", "string")
    fmt.Println(s)

    // 您可以使用`Fprintf`将格式化和打印输出到不同于`os.Stdout`的`io.Writer`。
    fmt.Fprintf(os.Stderr, "io: an %s\n", "error")
}

运行结果如下:

$ go run string-formatting.go
struct1: {1 2}
struct2: {x:1 y:2}
struct3: main.point{x:1, y:2}
type: main.point
bool: true
int: 123
bin: 1110
char: !
hex: 1c8
float1: 78.900000
float2: 1.234000e+08
float3: 1.234000E+08
str1: "string"
str2: "\"string\""
str3: 6865782074686973
pointer: 0xc0000ba000
width1: |    12|   345|
width2: |  1.20|  3.45|
width3: |1.20  |3.45  |
width4: |   foo|     b|
width5: |foo   |b     |
sprintf: a string
io: an error