在线文档 > 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