Go за Прикладом: Форматування Рядків

Go offers excellent support for string formatting in the printf tradition. Here are some examples of common string formatting tasks.

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

Працюючи з форматуванням рядків ми спершу маємо зрозуміти поняття “дієслова”, яким є спеціалізований ключ або комбінація ключів. Такі ключі вживаються для заміни/перетворення значення в рядку. Наприклад, %v дозволяє сформувати та надрукувати приклад нашої структури 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)

Форматування логічного типу даних (bool) простіше-простого.

    fmt.Printf("bool: %t\n", true)

Існує багато варіцій форматування для цілих чисел. Використання %d призведе до стандартного - десятичного форматування.

    fmt.Printf("int: %d\n", 123)

Так наприклад відображувати значення у двійковій системі числення.

    fmt.Printf("bin: %b\n", 14)

Код %c надрукує відповідний числу (ascii) символ.

    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\"")

Для подвійної екранізацій рядків скористайтесь %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)

Ви такою можете вказати довжину чисел після коми для десяткових чисел, хоча зазвичай вам також знадобиться обмежити точність обрахунку числа після коми водночас до точності кількості знаків.

    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)

Ви можете сформувати та надрукувати до io.Writers (на противагу os.Stdout в яке проходить друк з Printf) скориставшись Fprintf.

    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: 0x1400009c020
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

Наступний приклад: Текстові Шаблони.