Leer un archivo de configuración para tu aplicación de Go
¿Qué es un archivo de configuración?
Un archivo de configuración es un archivo de texto plano que puede ser modificado por el usuario para dar ciertos parametros de configuración a una aplicación. Un ejemplo de estos serían los archives de configuración de Apache o el archive de configuración de Git.
¿Existe algún formato específico?
아니요, 특별한 형식이 없습니다. Bien podría ser un xml, un yml, un json o incluso existen programas que crean su propia sintaxis para sus archivos de configuración. Para este ejemplo usaremos un archivo json.
누에스트로 프로젝트
Tendremos un proyecto de ejemplo con el siguiente árbol de directorios:
.
├── Makefile
├── cmd
│ └── app
│ └── main.go
├── config
│ └── config.go
├── config.json
├── go.mod
└── service
└── foo.go
Definiendo nuestro paquete de configuración
Este paquete se encargará de leer nuestro archivo de configuración. Además tendrá que hacerlo una sola vez, ya que la configuración con cambiará durante la ejecución de nuestra aplicación.
Para esto tenemos que aplicar un patrón de diseño conocido como singleton. Lo cual crea una única instancia de un tipo de dato en nuestra aplicación.
덴트로 데
config/config.go
creamos una estructura para almacenar la información de nuestra configuración y un puntero de la misma.type Config struct {
Name string `json:"name"`
Age int `json:"age"`
}
var config *Config
Exponemos una función llamada
GetConfig
la cual retorna un *Config
. Dentro de esta función revisamos que el puntero config
declarado anteriormente se encuentre vacío.if config == nil {
log.Println("Loading config file...")
}
Una vez asegurados que
config
no contiene información podemos abrir el archivo de configuración utilizando el path del archivo. En este ejemplo el path se pasa directamente, pero bien podría tomarse de una variable de entorno para definir otra ruta de archivo.file, _ := os.Open("config.json")
defer file.Close()
Una vez abierto el archivo se crea un decoder de tipo JSON para poder leerlo. Y en caso de error se colocan valores por deftoto en una variable de tipo
Conf
.decoder := json.NewDecoder(file)
var conf Config
err := decoder.Decode(&conf)
if err != nil {
conf.Name = "Default Name"
conf.Age = 21
}
Para poder pasar los valores de la 변수
conf
알 푼테로 config
creamos unSync.Once
.var config *Config
var once sync.Once
Y dentro de nuestra función de
GetConfig
활용도 once
para poder pasar nuestra info a config
.once.Do(func() {
config = &Config{
Name: conf.Name,
Age: conf.Age,
}
})
Y por último
GetConfig
retornará config
새로운 검증을 거부합니다.func GetConfig() *Config {
if config == nil {
log.Println("Loading config file...")
file, _ := os.Open("config.json")
defer file.Close()
decoder := json.NewDecoder(file)
var conf Config
err := decoder.Decode(&conf)
if err != nil {
conf.Name = "Default Name"
conf.Age = 21
}
once.Do(func() {
config = &Config{
Name: conf.Name,
Age: conf.Age,
}
})
}
return config
}
새로운 구성 활용
누에스트로
cmd
encargará únicamente de iniciar nuestra nuestra aplicación llamando la función Start
dentro de service/foo.go
.package main
import "config/service"
func main() {
service.Start()
}
와이
service/foo.go
nuestra aplicación의 기능에 대한 경향. Donde llamaremos a GetConfig
para obtener nuestra configuración.Dentro de la función
Start
llamaremos por multiples veces a GetConfig
y notaremos que la inicialización del puntero sólo sucede una vez.Obtenemos la configuración y la utilizamos para imprimir un mensaje en pantalla. Además ejecutamos las funciones
foo
Y bar
.func Start() {
conf := config.GetConfig()
fmt.Printf("Hello %s. You are %d years old.\n", conf.Name, conf.Age)
foo()
bar()
}
덴트로 데
foo
Y bar
haremos 알고 비슷합니다. Obtendremos nuestra configuración y la utilizaremos para imprimir un mensaje en pantalla.func foo() {
conf := config.GetConfig()
fmt.Printf("Hello from foo> %s | %d\n", conf.Name, conf.Age)
}
func bar() {
conf := config.GetConfig()
fmt.Printf("Hello from bar> %d | %s\n", conf.Age, conf.Name)
}
Compilamos el proyecto y podemos ver que el log colocado dentro de
GetConfig
Sólo se muestra una vez. Además podemos notar que se están utilizando los valores por default colocados en el manejo del error en GetConfig
. Esto porque no existe aún el archivo config.json
dentro de nuestro proyecto.$ make compile
$ ./app
2022/06/18 16:50:40 Loading config file...
Hello Default Name. You are 21 years old.
Hello from foo> Default Name | 21
Hello from bar> 21 | Default Name
$
Creamos el archivo
config.json
Con el siguiente contenido:{
"age": 29,
"name": "Wako"
}
Y ejecutamos el programa de nuevo. 컴파일러가 필요하지 않습니다.
$ ./app
2022/06/18 16:53:18 Loading config file...
Hello Wako. You are 29 years old.
Hello from foo> Wako | 29
Hello from bar> 29 | Wako
$
De esta forma es fácil proofer de nuestros programas de Go archivos de configuración. Pueden encontrar el código completeto aquí . Además acá Pueden ver un ejemplo más complejo aplicado a un generador de arte digital.
Reference
이 문제에 관하여(Leer un archivo de configuración para tu aplicación de Go), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/4k1k0/leer-un-archivo-de-configuracion-para-tu-aplicacion-de-go-6bo텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)