Форматированный вывод

Последнее обновление: 15.01.2018

Ряд возможностей по чтению и записи файлов предоставляет пакет fmt. Этот пакет предоставляет ряд функций для записи данных в произвольный объект, который реализует интерфейс io.Writer: fmt.Fprint(), fmt.Fprintln() и fmt.Fprintf().

Функции Fprint и Fprintln

Функции Fprint и Fprintln имеют примерно одинаковое определение:

func Fprint(w io.Writer, a ...interface{}) (n int, err error)
func Fprintln(w io.Writer, a ...interface{}) (n int, err error)

Первым параметром передается объект, который реализует интерфейс io.Writer. А второй параметр представляет набор объектов, которые записываются в поток. Обе функции возвращают количество записанных байтов и информацию об ошибке. Отличием функции Fprintln является то, что она добавляет при выводе перевод строки, то есть фактически записывает строку. Например:

package main
import (
	"fmt"
	"os"
)

func main() {
	file, err := os.Create("confeve.txt")
	if err != nil{
		fmt.Println(err) 
        os.Exit(1) 
	}
	defer file.Close() 
	fmt.Fprint(file, "Сегодня ")
	fmt.Fprintln(file, "хорошая погода")
}

В данном случае обе функции записывают некоторый текст в файл confeve.txt, который будет создан в той же папке, где расположен выполняемый скрипт.

Форматирование и Fprintf

Функция Fprintf упрощает запись сложных по структуре данных:

func Fprintf(w io.Writer, format string, a ...interface{}) (n int, err error)

Первым параметром также идет объект io.Writer. Второй параметр представляет строку форматирования, которая указывает, как данные будут форматироваться при записи. И третий параметр - набор значений, которые передаются в строку форматирования и записываются в поток вывода.

Строка форматирования представляет набор спецификаторов. Каждый спецификатор представляет набор символов, которые интерпретируются определенным образом и предваряются знаком процента %. Каждый спецификатор представляет определенный тип данных:

  • %t: для вывода значений типа boolean (true или false)

  • %b: для вывода целых чисел в двоичной системе

  • %c: для вывода символов, представленных числовым кодом

  • %d: для вывода целых чисел в десятичной системе

  • %o: для вывода целых чисел в восьмеричной системе

  • %q: для вывода символов в одинарных кавычках

  • %x: для вывода целых чисел в шестнадцатиричной системе, буквенные символы числа имеют нижний регистр a-f

  • %X: для вывода целых чисел в шестнадцатиричной системе, буквенные символы числа имеют верхний регистр A-F

  • %U: для вывода символов в формате кодов Unicode, например, U+1234

  • %e: для вывода чисел с плавающей точкой в экспоненциальном представлении, например, -1.234456e+78

  • %E: для вывода чисел с плавающей точкой в экспоненциальном представлении, например, -1.234456E+78

  • %f: для вывода чисел с плавающей точкой, например, 123.456

  • %F: то же самое, что и %f

  • %g: для длинных чисел с плаващей точкой используется %e, для других - %f

  • %G: для длинных чисел с плаващей точкой используется %E, для других - %F

  • %s: для вывода строки

  • %p: для вывода значения указателя - адреса в шестнадцатеричном представлении

Также можно применять универсальный спецификатор %v, который для типа boolean аналогичен %t, для целочисленных типов - %d, для чисел с плавающей точкой - %g, для строк - %s.

К спецификаторам можно добавлять различные флаги, которые влияют на форматирование значений. Например, число перед спецификатором указывает, какую минимальную длину в символах будет занимать выводимое значение. Например, %9f - число с плаващей точкой будет занимать как минимум 9 позиций. Если ширина больше, чем требуется значению, то заполняется пробелами.

Для чисел с плавающей точкой можно указать точность или количество символов в дробной части. Для этого количество символов указывается после точки: %.2f - две цифры в дробной части после точки. Например, варианты форматирования чисел с плавающей точкой:

  • %f: точность и ширина значения по умолчанию

  • %9f: ширина - 9 символов и точность по умолчанию

  • %.2f: ширина по умолчанию и точность - 2 символа

  • %9.2f: ширина - 9 и точность - 2

  • %9.f: ширина - 9 и точность - 0

Также из флагов следует отметить дефис -, который дополняет значение пробелами не справа, как по умолчанию, а слева.

Применим функцию Fprintf для вывода в файл:

package main
import (
	"fmt"
	"os"
)
type person struct { 
   name string 
   age int32 
   weight float64 
}
func main() {
	tom := person {
		name:"Tom",
		age: 24,
		weight: 68.5,
	}
	file, err := os.Create("person.dat")
	if err != nil{
		fmt.Println(err) 
        os.Exit(1) 
	}
	defer file.Close() 
	fmt.Fprintf( file, 
               "%-10s %-10d %-10.3f\n", 
               tom.name, tom.age, tom.weight)
}

Функция Fprintf() в качестве первого параметра также принимает файл, а в качестве второго параметра - строку форматирования, которая определяет, как данные будут форматироваться. После строки форматирования перечисляются значения, которые вставляются вместо спецификаторов. При этом значения передаются на место спецификаторов по позиции. Например, первое значение передается вместо первого спецификатора, второе значение - вместо второго спецификатора и так далее. При этом значения должны соответствовать спецификаторам по типу: на место спецификатора %s должна передаваться строка, на место %d - целое число и т.д.

Таким образом, в примере выше будет создан в одной папке со скриптом файл person.dat, в который будет записаны данные объекта person.

Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850