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

Work in Progress / Сайт в процесі розробки

В Go реалізована хороша підтримка строкового форматування ( традиційно таке форматування слідує канонам мови програмування С ). Розглянемо найбільш часто вживані приклади строкового форматування.

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

Працюючи з форматуванням рядків ми спершу маємо зрозуміти поняття “дієслова”, яким є спеціалізований ключ або комбінація ключів. Такі ключі вживаються для заміни/перетворення значення в рядку. Наприклад, %v дозволяє сформатувати та надрукувати приклад нашої структури point.

    p := point{1, 2}
    fmt.Printf("%v\n", p)

Якщо значення є структурою, %+vваріація покаже її поля.

    fmt.Printf("%+v\n", p)

Варіація %#v відформатує відображення значення синтаксисом Go, включаючи код який продукуватиме це значення.

    fmt.Printf("%#v\n", p)

Тип значення можна отримати за допомогою дієслова %T.

    fmt.Printf("%T\n", p)

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

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

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

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

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

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

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

    fmt.Printf("%c\n", 33)

%x надасть відображення в шіснадцятковій системі числення.

    fmt.Printf("%x\n", 456)

Також є кілька налаштувань для форматування чисел з плаваючою комою. Найбільш базовим з нах є %f.

    fmt.Printf("%f\n", 78.9)

%e та %E форматують число з плаваючою комою у кількох різних варіантах експоненціального (або, як його ще називають, “наукового”) запису.

    fmt.Printf("%e\n", 123400000.0)
    fmt.Printf("%E\n", 123400000.0)

Базове відобряження рядків %s.

    fmt.Printf("%s\n", "\"рядок\"")

Для подвійної екранізацій рядків скористайтесь %q.

    fmt.Printf("%q\n", "\"рядок\"")

Так само, як і з чілими числами, %x трансформує рядок у шістнадцяткове відображення, з друком двох символів на байт вхідного параметру.

    fmt.Printf("%x\n", "лишенько!")

Щоб надрукувати адресу пам’яті вказівника (а так відображаються вказівники) використайте %p.

    fmt.Printf("%p\n", &p)

Коли форматуєте рядки - вам інколи необхідно буде контролювати точність та довжину фінального “числа”. Щоб вказати довжину цілого числа, скористайтесь числом після символа % у дієслові. За стандартними налаштуваннями результатом буде вирівняне по правій стороні і відбите пробілами число.

    fmt.Printf("|%6d|%6d|\n", 12, 345)

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

    fmt.Printf("|%6.2f|%6.2f|\n", 1.2, 3.45)

Для вирівнювання вліво, скористайтесь прапорцем - після %.

    fmt.Printf("|%-6.2f|%-6.2f|\n", 1.2, 3.45)

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

    fmt.Printf("|%6s|%6s|\n", "foo", "b")

Вирівняти по лівій стороні можна за допомогою, вже знайомого нам за попереднім прикладом з числам, прапорцем -, що ставиться після %.

    fmt.Printf("|%-6s|%-6s|\n", "foo", "b")

Допоки ми бачили Printf, що друкує форматовану рядок до os.Stdout. Sprintf сформатує та поверне рядок без його друку.

    s := fmt.Sprintf("це %s", "рядок")
    fmt.Println(s)

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

    fmt.Fprintf(os.Stderr, "ой %s\n", "халепа")
}
$ go run string-formatting.go
{1 2}
{x:1 y:2}
main.point{x:1, y:2}
main.point
true
123
1110
!
1c8
78.900000
1.234000e+08
1.234000E+08
"рядок"
"\"рядок\""
d0bbd0b8d188d0b5d0bdd18cd0bad0be21
0xc0000160b0
|    12|   345|
|  1.20|  3.45|
|1.20  |3.45  |
|   foo|     b|
|foo   |b     |
це рядок
ой халепа

Наступний приклад: Регулярні вирази.