範例導覽:字串格式化

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)

有許多可用於格式化整數的選項。針對標準 10 進位格式化,請使用 %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.StdoutSprintf 會格式化並傳回字串,而不會將其列印在任何地方。

    s := fmt.Sprintf("sprintf: a %s", "string")
    fmt.Println(s)

您可以使用 Fprintf 格式化並列印到 os.Stdout 以外的 io.Writers

    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

下一個範例:文字範本.