Шаг 20.
Язык программирования Go.
Пример приложения для поиска повторяющихся строк

    На этом шаге рассмотрим пример приложения для поиска повторяющихся строк в тектовом файле (файлах).

    Нужно разработать приложение, которое позволяет подсчитать количество повторяющихся строк в файле (файлах), имена файлов передаются как аргументы командой строки. Программа должна выводить строку и количество ее повторений.

    Результат работы приложения со стихотворением С.Я. Маршака "Дом, который построил Джек" представлен на рис. 1:


Рис.1. Поиск повторяющихся строк

counts := make(map[string]int) /*Отображение (map) содержит набор пар "ключ-значение"
и обеспечивает константное время выполнения операций хранения, извлечения или
проверки наличия элемента в множестве. Ключ может быть такого типа, значения которого
можно сравнить с помощью оператора ==; распространенным примером ключа являются
строки. Значение может быть любого типа. В нашем примере ключи представляют собой
строки, а значения представлены типом int. Встроенная функция make создает новое
пустое отображение*/
for _, fname := range os.Args[1:] {
	data, err := ioutil.ReadFile(fname) /*Функция ReadFile (пакет io/ioutil)
                                           возвращает байтовый срез, который должен
                                           быть преобразован в string так, чтобы его
                                           можно было разбить с помощью функции
                                           strings.Split (пакет strings)*/
	if err != nil { //вывод возможной ошибки при чтении данных из файла
		fmt.Fprintf(os.Stderr, "%v\n", err)
		continue
	}
/*Данные, прочитанные из файла, разбиваем на строки и считаем повторения.
Когда новая строка встречается впервые, выражение counts [line]
присваивает нулевое значение новому элементу, которое для типа int равно 0*/
	for _, line := range strings.Split(string(data), "\n") {
		counts[line]++
	}
}
/* Для вывода результатов используем цикл по отображению counts.
Каждая итерация дает две величины - ключ и значение элемента отображения
для этого ключа. Порядок обхода отображения не определен, на практике
этот порядок случаен и варьируется от одного выполнения программы к другому*/
for line, n := range counts {
	if n > 1 {
		fmt.Printf("%s\t%d\n", line, n)
	}
}

    Архив примера можно взять здесь.

    Функция fmt.Printf выполняет форматированный вывод на основе списка выражений. Первым ее аргументом является строка формата, которая указывает, как должны быть отформатированы последующие аргументы. Формат каждого аргумента определяется символом преобразования, буквой, следующей за знаком процента. Например, %d форматирует целочисленный операнд в десятичной записи, a %s выводит значение строкового операнда.

    Функция Printf имеет больше десятка таких преобразований, которые программисты на Go называют глаголами (verbs), часть из них представлена в таб.1.

Таблица 1. Некоторые преобразования функции Printf
Глагол Описание
%d Десятичное целое
%х, %о, %b Целое в шестнадцатеричном, восьмеричном и двоичном представлениях
%f, %g, %е Числа с плавающей точкой: 3.141593 3.141592653589793 3.141593e+00
%t Булево значение: true или false
Руна (символ Unicode)
%s Строка
%q Выводит в кавычках строку типа "abc" или символ типа ' с '
%v Любое значение в естественном формате
%T Тип любого значения
%% Символ процента

    На следующем шаге рассмотрим пример создания простого HTTP-сервера в Go.


Предыдущий шаг Содержание Следующий шаг