Замут на 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.