landergate
@landergate
IT-шный jack-of-all-trades

Как спарсить опцию из текстового конфига?

Есть текстовый конфиг следующего формата:
// Global SQL settings
sql.db_hostname: 127.0.0.1
sql.db_port: 3306
sql.db_username: crux
sql.db_password: z8eGmcqYBAFpbvN4mypP


Как можно взять значение опции sql.db_port в переменную?
Приветствуется живой пример кода.

Что я пробовал:
https://github.com/go-ini/ini
https://github.com/Unknwon/goconfig
но в моём конфиге нет [section] над опциями, а способов парсинга без него в документации или коде этих проектов я найти не смог.
https://github.com/spf13/viper - не умеет INI/двоеточия

Менять формат конфига нельзя, это сторонний проект.
  • Вопрос задан
  • 331 просмотр
Решения вопроса 1
Можно же руками спарсить, там довольно просто все
https://play.golang.org/p/Ug42O-eZnl
package main

import (
	"fmt"
	"strings"
)

func main() {

	data := `// Global SQL settings
sql.db_hostname: 127.0.0.1
sql.db_port: 3306
sql.db_username: crux

sql.db_password: z8eGmcqYBAFpbvN4mypP`

	config := ParseConfig(data)
	fmt.Println(config["sql.db_port"])
}

func ParseConfig(data string) map[string]string {
	parsed := make(map[string]string)

	lines := strings.Split(data, "\n")
	for _, line := range lines {
		trimmedLine := strings.Trim(line, " \r\n")
		if trimmedLine != "" && !strings.HasPrefix(trimmedLine, "//") {
			pair := strings.SplitN(trimmedLine, ":", 2)
			if len(pair) == 2 {
				parsed[strings.Trim(pair[0], " ")] = strings.Trim(pair[1], " ")
			}
		}
	}

	return parsed
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы