Я считаю, что для многих сусликов, моя статья, я был по сравнению с основным, я более года опыта программистов Golaang, с 5 лет опыта программирования.
Golang по-прежнему дружелюбен к новичкам, и написание кода очень хорошее, но индустрии больше не хватает BP Golang Engineering и проекта, или есть много сторон, чтобы спорить, но они сделали гораздо больше, чем зависимые инструменты управления. известныйdep
, vgo
и официальный голангgo module
, или это может быть из-за моих ограниченных знаний, надеюсь, вы меня просветите.
Поскольку мы хотим поговорить о конфигурационном файле проекта go, давайте сделаем краткое введение в конфигурационный файл:
Формат файла конфигурации
yaml
yaml — популярный в последнее время язык описания, он относительно прост в использовании, имеет низкую стоимость обучения и четкую структуру, все детали можно освоить за 5 минут.Учебник по грамматике yaml от учителя Руан ИфэнПростой пример выглядит следующим образом:
database:
addr: localhost
port: 3306
username: testuser
password: abcdef
listen:80
ini
Файл ini также является относительно распространенным форматом файлов конфигурации и почти не требует затрат на обучение, относительно прост и имеет только две концепции. Блок и пара ключ-значение, но возможность выражения относительно ограничена, формат следующий:
[database]
addr = localhost
port = 3306
[web]
listen = 80
json
json — очень популярный язык описания с сильными выразительными возможностями, очень интуитивно понятный и обычно не требует никаких затрат на обучение. Общие форматы следующие:
{
"database":{
"database":"localhost",
"port":3306
},
"web":{
"listen":80
}
}
properties
Файл свойств должен быть знаком многим программистам Java, потому что во многих весенних проектах вы часто будете видеть такой файл.Конечно, не звоните мне, если вы его не использовали.Этот вид файла полностью зависит от вашего хобби и увлечения. Простой формат файла выглядит следующим образом:
addr=localhost
port=3306
Конфигурационный файл Голанга
Зачем проектам golang нужны конфигурационные файлы
Для многих элементов, связанных с конфигурацией, таких как прослушиваемые порты, адреса базы данных, порты и т. д., более удобно размещать их в конфигурации, а не жестко запрограммировать в коде, поэтому использование файлов конфигурации является относительно распространенным явлением. Вам не нужно беспокоиться о том, какой тип файла конфигурации использовать, просто в соответствии с вашими потребностями,
Несколько файлов конфигурации должны реагировать на сцену
- Чтение файлов конфигурации во время запуска/отладки IDE
- Чтение файла конфигурации при запуске одного теста или эталонного теста.
- Исполняемый файл (файл развертывания) читает файл конфигурации
- В проекте необходимо использовать только один файл конфигурации, и файл конфигурации можно нормально прочитать в трех вышеуказанных случаях.
Размещение конфигурационных файлов
Как правило, файл конфигурации будет помещен в корневой каталог проекта или в более очевидное место.Конечно, для Golang я лично рекомендую разместить его в корневом каталоге проекта.Конечно, это не невозможно разместить его в других каталогах, но это может быть более проблематично.
Как выполнить несколько сценариев, с которыми должен иметь дело файл конфигурации?
- Прочитайте файл конфигурации из исполняемого каталога проекта, код примера выглядит следующим образом:
// get config file from where the executables lies
func getConfigFileFromExecutable(fileName string) *os.File {
dir, err := filepath.Abs(filepath.Dir(os.Args[0]))
if err != nil {
return nil
}
f, err := os.Open(path.Join(dir, fileName))
if err != nil {
return nil
}
return f
}
- Рекурсивный поиск из каталога, в котором находится файл исходного кода, в верхний каталог
// read config file
func TestReadConfigFile(t *testing.T) {
if _, fileNameWithPath, _, ok := runtime.Caller(1); ok {
d := ReadConfigFile(testFileName, fileNameWithPath)
if d == nil {
t.FailNow()
}
}
}
Ключом к этой реализации является то, чтоruntime.Caller(1)
, эта функция может возвращать каталог, в котором находится исходный код, но в соответствии с различными параметрами требования к расположению для вызова также различаются, настройка здесь может просто соответствовать потребностям корневого каталога проекта.
проект с открытым исходным кодом
адрес проектаКак это точка, как (звезда), есть проблема, то вы можете упомянуть о проблеме.Связаться со мной.
Способ его получения следующий
go get github.com/winjeg/goconf
Этот проект используетgo module
как управление зависимостями, но также совместим с традиционнымdep
как инструмент управления зависимостями
Поддерживаемые форматы
- формат yaml
- формат INI
Пример использования
package goconf
import (
"strings"
"testing"
)
const (
testYmlFile = "test.yaml"
testIniFile = "test.ini"
host = "10.1.1.1"
port = 3306
testName = "tom"
)
type TestYmlConf struct {
DbAddr string `yaml:"dbAddr"`
Port int `yaml:"dbPort"`
}
type TestMyConf struct {
Mysql TestIniConf `ini:"mysql"`
Name string `ini:"name"`
}
type TestIniConf struct {
Host string `ini:"host"`
Port int `ini:"port"`
}
func TestYaml2Object(t *testing.T) {
var x TestYmlConf
err := Yaml2Object(testYmlFile, &x)
if err != nil {
t.FailNow()
}
if !strings.EqualFold(x.DbAddr, host) || x.Port != port {
t.FailNow()
}
}
func TestIni2Object(t *testing.T) {
var x TestMyConf
err := Ini2Object(testIniFile, &x)
if err != nil {
t.FailNow()
}
if !strings.EqualFold(x.Mysql.Host, host) || x.Mysql.Port != port || !strings.EqualFold(testName, x.Name) {
t.FailNow()
}
}
Вам нужно только определить необходимую вам структуру конфигурации, и вы можете правильно прочитать конфигурацию, указав имя файла.Его также очень просто использовать.Рекомендуется поместить его в项目的根目录
читать правила заказа
- Сначала прочитайте файл конфигурации из рабочего каталога исполняемого файла.
- Если он не может быть прочитан, он будет прочитан из каталога, в котором находится исходный код проекта.Если он не может быть прочитан, он будет рекурсивно искать в корневом каталоге, пока не будет достигнут корневой каталог.
- Не удается найти файл конфигурации, выдает ошибку, не возвращает найденную ошибку
напиши в конце
Может быть много способов работы с конфигурационными файлами golang, поэтому, если у вас есть другие лучшие методы, вы можете поделиться ими, чтобы все могли вместе учиться и добиваться прогресса.Если у вас есть какие-либо вопросы, оставьте комментарий ниже или перейдите в мой проект. адрес выше. Сообщите о проблеме.
Если эта статья воспроизводится, пожалуйста, не изменяйте исходное содержание.