cpp

Вывод данных

Для вывода данных в языке Go удобнее всего использовать функцию Println() из пакета fmt. Мы уже воспользовались этой функцией в листинге 1.1 для вывода приветствия в окно консоли. Функция имеет следующий формат:

fmt.Println(a ...interface{}) (n int, err error)

Фрагмент fmt. означает, что функция определена в пакете fmt. Поэтому прежде чем использовать функцию нужно подключить указанный в формате функции пакет с помощью инструкции import:

import "fmt"

Функция Println() принимает один параметр, который имеет тип interface{}. Такой тип называется пустым интерфейсом. Пустой интерфейс реализуют данные любого типа, поэтому в функцию мы можем передать любые данные, например, целое число:

fmt.Println(10) // 10

После вывода значения автоматически вставляется символ перевода строки. Давайте два раза вызовем функцию, передадим строки и посмотрим на результат:

fmt.Println("Строка 1")
fmt.Println("Строка 2")

Результат выполнения в окне консоли:

Строка 1
Строка 2

Мы получили две строки, причем на русском языке без проблем с кодировками. Преобразование кодировок при выводе данных производится автоматически.

Если функция вызывается без параметра, то она просто выводит символ перевода строки в окно консоли:

fmt.Println("Строка 1")
fmt.Println()
fmt.Println("Строка 3")

Результат выполнения в окне консоли:

Строка 1

Строка 3

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

fmt.Println(true, 10, 14.5, "строка") // true 10 14.5 строка

Обратите внимание: при выводе между значениями добавляется пробел.

Функция Println() возвращает сразу два значения. Первое значение содержит количество байт, записанных в поток. Через второе значение можно получить сообщение об ошибке. Если ошибка не возникла, то значением будет nil. Пример получения значений:

n, err := fmt.Println("строка") // строка
fmt.Println(n, err)             // 13 <nil>

Итак, 13 байтов было выведено в поток. Каждая русская буква в кодировке UTF-8 кодируется двумя байтами. В результате шесть символов в слове строка — это 12 байтов. Дополнительно функция отправляет в поток символ перевода строки, который занимает 1 байт. Итого получаем 13 байтов. Ошибок при выводе не возникло, поэтому переменная err содержит значение nil.

Вместо функции Println() можно воспользоваться функцией Print(). Формат функции:

fmt.Print(a ...interface{}) (n int, err error)

В отличие от функции Println() функция Print() не добавляет символ перевода строки в поток. Давайте два раза вызовем функцию, передадим строки и посмотрим на результат:

fmt.Print("Строка 1")
fmt.Print("Строка 2")

Результат выполнения в окне консоли:

Строка 1Строка 2

Мы получили все данные на одной строке. Если нужно добавить перенос строки, то это следует сделать явно с помощью символа \n:

fmt.Print("Строка 1\n")
fmt.Print("Строка 2")

Результат выполнения в окне консоли:

Строка 1
Строка 2

В отличие от функции Println() функция Print() не всегда добавляет пробел между данными. Если с одной из сторон находится строка, то пробел не добавляется:

fmt.Print("Строка", 10)             // Строка10
fmt.Print(true, 10, 14.5, "строка") // true 10 14.5строка

Функция Print() возвращает два значения. Первое значение содержит количество байт, записанных в поток. Через второе значение можно получить сообщение об ошибке. Если ошибка не возникла, то значением будет nil. Пример получения значений:

n, err := fmt.Print("строка")   // строка
fmt.Println(n, err)             // 12 <nil>

С помощью стандартного вывода можно создать индикатор выполнения процесса в окне консоли. Чтобы реализовать такой индикатор нужно вспомнить, что символ перевода строки в Windows состоит из двух символов \r (перевод каретки) и \n (перевод строки). Таким образом, используя только символ перевода каретки \r можно перемещаться в начало строки и перезаписывать ранее выведенную информацию. Пример индикатора процесса показан в листинге 1.2.

Листинг 1.2. Индикатор выполнения процесса

package main

import (
   "fmt"
   "time"
)

func main() {
   fmt.Print("... 0%")
   for i := 5; i < 101; i += 5 {
      time.Sleep(1 * time.Second) // Имитация процесса
      fmt.Print("\r... ", i, "%")
   }
   fmt.Print("\n")
}

Эта программа немного сложнее, чем простое приветствие из листинга 1.1. Здесь присутствует имитация процесса с помощью функции Sleep() (при этом программа «засыпает» на указанное количество времени). Формат функции:

time.Sleep(d time.Duration)

Прежде чем использовать функцию Sleep() нужно подключить пакет time. Посмотрите как подключаются сразу несколько пакетов:

import (
   "fmt"
   "time"
)

Кроме того, в программе использован цикл for, который позволяет изменить порядок обработки инструкций. Обычно программа выполняется сверху вниз и слева направо. Инструкция за инструкцией. Цикл for меняет эту последовательность выполнения. Инструкции, расположенные внутри блока (внутри фигурных скобок), выполняются несколько раз. Количество повторений зависит от выражений после ключевого слова for. Этих выражений три, и разделены они точками с запятой. Первое выражение объявляет целочисленную переменную i и присваивает ей значение 5. Второе выражение является условием продолжения повторений. Пока значение переменной i меньше значения 101, инструкции внутри блока будут повторяться. Это условие проверяется на каждой итерации цикла. Третье выражение на каждой итерации цикла прибавляет значение 5 к текущему значению переменной i.

Существуют также глобальные функции print() и println(). Форматы функций:

print(args ...Type)
println(args ...Type)

Функции можно использовать для вывода логических и числовых типов, а также строк на этапе отладки. При этом никаких пакетов подключать не нужно. Функция print() просто выводит переданные значения без добавления пробелов и перевода строки:

print("Строка 1")
print("Строка 2", true, 10, 14.5)

Результат в окне консоли:

Строка 1Строка 2true10+1.450000e+001

Функция println() добавляет пробелы между значениями и перевод строки в конце:

println("Строка 1")
println("Строка 2", true, 10, 14.5)

Результат в окне консоли:

Строка 1
Строка 2 true 10 +1.450000e+001

Обратите внимание: функции print() и println() выводят данные в поток ошибок, а не в стандартный поток вывода. Поэтому используйте их только в целях отладки приложения. Давайте перенаправим потоки в разные файлы:

C:\book\test>go build main.go

C:\book\test>.\main.exe 1> out.txt 2> err.txt

Стандартному потоку вывода (os.Stdout) соответствует дескриптор 1. Данные из этого потока будут записаны в файл out.txt. Потоку вывода сообщений об ошибках (os.Stderr) соответствует дескриптор 2. Данные из этого потока будут записаны в файл err.txt. Так вот, данные, записанные с помощью функций print() и println(), попадут в файл err.txt. Если же мы воспользуемся функциями Print() и Println() из пакета fmt, то данные будут записаны в файл out.txt. Поэтому в обычных ситуациях лучше пользоваться функциями из пакета fmt.

Для вывода в указанный поток можно воспользоваться функциями Fprint() и Fprintln() из пакета fmt. Форматы функций:

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

В первом параметре указывается поток вывода. Это может быть файл или стандартный поток вывода (os.Stdout или os.Stderr). В последующих параметрах передаются выводимые значения. Поведение функции Fprint() аналогично функции Print(), а поведение функции Fprintln() аналогично функции Println(). Пример вывода сообщения в стандартный поток вывода:

// import "os"
fmt.Fprintln(os.Stdout, "x =", 10, 20)         // x = 10 20\n
fmt.Fprint(os.Stdout, "x =", 10, 20)           // x =10 20

Теперь выведем сообщение в стандартный поток ошибок:

fmt.Fprintln(os.Stderr, "Сообщение об ошибке") // Сообщение об ошибке

Учебник Go (Golang)
Учебник Go (Golang) в формате PDF

Помощь сайту

ЮMoney (Yandex-деньги): 410011140483022

ПАО Сбербанк:
Счет: 40817810855006152256
Реквизиты банка:
Наименование: СЕВЕРО-ЗАПАДНЫЙ БАНК ПАО СБЕРБАНК
Корреспондентский счет: 30101810500000000653
БИК: 044030653
КПП: 784243001
ОКПО: 09171401
ОКОНХ: 96130
Скриншот реквизитов

cpp