Go با مثال: قالب‌بندی رشته

Go پشتیبانی بسیار خوبی از قالب‌بندی رشته به سبک printf دارد. این چند نمونه از کارهای رایج قالب‌بندی رشته است.

package main
import (
    "fmt"
    "os"
)
type point struct {
    x, y int
}
func main() {

Go چند «فعل» (verb) چاپ دارد که برای قالب‌بندی مقادیر عمومی 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 رشته را در مبنای ۱۶ نمایش می‌دهد؛ به ازای هر بایت ورودی دو کاراکتر خروجی.

    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 می‌توانید در io.Writerهایی غیر از os.Stdout قالب‌بندی و چاپ کنید.

    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

مثال بعدی: .