Замут на Golang

Первые шаги в Web-сайт при помощи Go. Глава 3.

Подключение файла конфигурации

Это продолжение замута на Go Web-сервиса. Начало ищи где-то там.

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

Сделай текстовый файлик в кодировке utf-8: config.txt и запиши в него следующий конфиг:

Конфигурация веб-сервера

server=127.0.0.1

port=8080

theme=dark

version=1.0.3

сохраняй его и закрывай. Открывай свой main.go, который ты писал в первой главе, и дописывай в него такое:

В import добавить несколько пакетов:

package main

import (

"bufio" // Импортируем пакет для построчного чтения файла

"log"

"net/http"

"os" // Импортируем пакет для работы с файловой системой

"strings" // Импортируем пакет для работы со строками

)

. . .

Добавиться новая функция, которая будет считывать и обрабатывать файл конфигурации:

. . .

// Функция loadConfig читает конфигурации из файла config.txt

func loadConfig(filename string)

map[string]string { // Создаём пустую map для хранения конфигураций config := make(map[string]string) // Открываем файл

file, err := os.Open(filename)

if err != nil {

log.Fatalf("Ошибка при открытии конфигурационного файла: %v", err)

}

defer file.Close() // Закрываем файл после чтения

// Читаем файл построчно

scanner := bufio.NewScanner(file)

for scanner.Scan() {

line := scanner.Text() // Пропускаем пустые строки и комментарии

if line == "" || strings.HasPrefix(line, "#") {

continue

}

// Разделяем строку по знаку "="

parts := strings.SplitN(line, "=", 2)

if len(parts) == 2 {

key := strings.TrimSpace(parts[0])

value := strings.TrimSpace(parts[1])

config[key] = value // Добавляем пару ключ-значение в map

}

} // Проверяем наличие ошибок при сканировании if err := scanner.Err(); err != nil { log.Fatalf("Ошибка при чтении конфигурационного файла: %v", err) } return config } . . .

Как видно функция хорошо прокоментирована и, что в ней происходит всё понятно без дополнительных разьяснений.

Немного изменена функция home:

. . .// Функция home обрабатывает корневой маршрут "/"func home(w http.ResponseWriter, r *http.Request) { w.Header().Set("Content-Type", "text/html; charset=utf-8") // Отправляем HTML-контент в ответ w.Write([]byte("

Внимание! Проникновение в Web!

")) w.Write([]byte("

content.V07BiT.2025.Perved!

"))}. . .

сюда добавлена w.Header().Set("Content-Type", "text/html; charset=utf-8") строка, которая помогает браузеру вывести страницу на отображение, короче без неё браузер показывет вместо страницы код html.

Измениться функция main. В общем модуль main.go сейчас выглядит вот так:

package main import ( "bufio" // Импортируем пакет для построчного чтения файла "log" // Импортируем логгер для вывода сообщений "net/http" // Импортируем HTTP-пакет для запуска веб-сервера "os" // Импортируем пакет для работы с файловой системой "strings" // Импортируем пакет для работы со строками ) // Функция home обрабатывает корневой маршрут "/" func home(w http.ResponseWriter, r *http.Request) { w.Header().Set("Content-Type", "text/html; charset=utf-8") // Отправляем HTML-контент в ответ w.Write([]byte("

Внимание! Проникновение в Web!

")) w.Write([]byte("

content.V07BiT.2025.Perved!

")) } // Функция loadConfig читает конфигурации из файла config.txt func loadConfig(filename string) map[string]string { // Создаём пустую map для хранения конфигураций config := make(map[string]string) // Открываем файл file, err := os.Open(filename) if err != nil { log.Fatalf("Ошибка при открытии конфигурационного файла: %v", err) } defer file.Close() // Закрываем файл после чтения // Читаем файл построчно scanner := bufio.NewScanner(file) for scanner.Scan() { line := scanner.Text() // Пропускаем пустые строки и комментарии if line == "" || strings.HasPrefix(line, "#") { continue } // Разделяем строку по знаку "=" parts := strings.SplitN(line, "=", 2) if len(parts) == 2 { key := strings.TrimSpace(parts[0]) value := strings.TrimSpace(parts[1]) config[key] = value // Добавляем пару ключ-значение в map } } // Проверяем наличие ошибок при сканировании if err := scanner.Err(); err != nil { log.Fatalf("Ошибка при чтении конфигурационного файла: %v", err) } return config } func main() { // Загружаем конфигурации из файла config.txt config := loadConfig("config.txt") // Получаем значения server и port из конфигурации server := config["server"] port := config["port"] // Если порт не указан — используем значение по умолчанию if port == "" { port = "8080" } // Если сервер не указан — используем localhost if server == "" { server = "127.0.0.1" } // Создаём маршрутизатор mux := http.NewServeMux() mux.HandleFunc("/", home) // Назначаем обработчик для корневого маршрута // Выводим сообщение о запуске сервера log.Printf("start web-service: http://%s:%s", server, port) // Запускаем HTTP-сервер err := http.ListenAndServe(server+":"+port, mux) log.Fatal(err) // Завершаем программу, если возникла ошибка }

Сохраняй свой main.go и запускай на выполнение: go run main.go

В своём браузере, в адресной строке прописывай: localhost:8080 и должно на странице появиться вот такое:

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

Поэксперементируй. Попробуй конфигурацию сделать в формате json.

Начать дискуссию