Go 프로그래밍을 처음 접했고 궁금한 점이 있습니다 .Go 프로그램의 구성 매개 변수를 처리하는 기본 방법은 무엇입니까 ( 다른 컨텍스트에서 속성 파일이나 ini 파일을 사용할 수있는 종류 )?
Go 프로그래밍을 처음 접했고 궁금한 점이 있습니다 .Go 프로그램의 구성 매개 변수를 처리하는 기본 방법은 무엇입니까 ( 다른 컨텍스트에서 속성 파일이나 ini 파일을 사용할 수있는 종류 )?
답변:
JSON의 형식은 아주 잘 날 위해 일했습니다. 표준 라이브러리는 들여 쓰기 된 데이터 구조를 작성하는 방법을 제공하므로 읽기 쉽습니다.
이 golang-nuts thread 도 참조하십시오 .
JSON의 장점은 목록 및 매핑에 대한 의미론을 제공하면서도 구문 분석이 쉽고 사람이 읽기 쉽고 편집 할 수 있다는 점입니다 (매우 편리 할 수 있음).
사용법 예 :
conf.json :
{
"Users": ["UserA","UserB"],
"Groups": ["GroupA"]
}
구성을 읽는 프로그램
import (
"encoding/json"
"os"
"fmt"
)
type Configuration struct {
Users []string
Groups []string
}
file, _ := os.Open("conf.json")
defer file.Close()
decoder := json.NewDecoder(file)
configuration := Configuration{}
err := decoder.Decode(&configuration)
if err != nil {
fmt.Println("error:", err)
}
fmt.Println(configuration.Users) // output: [UserA, UserB]
defer file.Close()
open err을 확인한 후 아마
또 다른 옵션은 Tom Preston-Werner가 만든 INI와 유사한 형식 인 TOML 을 사용 하는 것입니다. 나는 그것을 위해 이동 파서 내장 되어 광범위하게 테스트를 . 여기에 제안 된 다른 옵션처럼 사용할 수 있습니다. 예를 들어이 TOML 데이터가something.toml
Age = 198
Cats = [ "Cauchy", "Plato" ]
Pi = 3.14
Perfection = [ 6, 28, 496, 8128 ]
DOB = 1987-07-05T05:45:00Z
그런 다음 다음과 같은 방법으로 Go 프로그램에로드 할 수 있습니다
type Config struct {
Age int
Cats []string
Pi float64
Perfection []int
DOB time.Time
}
var conf Config
if _, err := toml.DecodeFile("something.toml", &conf); err != nil {
// handle error
}
Viper 는 JSON, YAML 및 TOML과 함께 작동하는 golang 구성 관리 시스템입니다. 꽤 흥미로운 것 같습니다.
더 복잡한 데이터 구조에는 일반적으로 JSON을 사용합니다. 단점은 사용자에게 오류의 위치, 다양한 에지 사례 및 그렇지 않은 것을 알려주는 많은 코드로 쉽게 끝날 수 있다는 것입니다.
기본 구성 (api 키, 포트 번호 등)의 경우 gcfg 패키지를 사용하는 것이 좋습니다 . git config 형식을 기반으로합니다.
설명서에서 :
샘플 구성 :
; Comment line
[section]
name = value # Another comment
flag # implicit value for bool is true
struct 이동 :
type Config struct {
Section struct {
Name string
Flag bool
}
}
그리고 코드는 그것을 읽어야했습니다.
var cfg Config
err := gcfg.ReadFileInto(&cfg, "myconfig.gcfg")
슬라이스 값도 지원하므로 키를 여러 번 지정할 수 있으며 이와 같은 다른 멋진 기능을 사용할 수 있습니다.
iniflags 와 함께 표준 go 플래그를 사용 하십시오 .
표준 이동 플래그는 다음과 같은 이점이 있습니다.
유일한 단점은 표준 go 플래그입니다-앱에 사용되는 플래그 수가 너무 많을 때 관리 문제입니다.
Iniflags는이 문제를 우아하게 해결합니다. 기본 패키지에서 두 줄을 수정하면 ini 파일에서 플래그 값을 읽는 데 도움이됩니다. 명령 행에서 새 값을 전달하여 ini 파일의 플래그를 대체 할 수 있습니다.
자세한 내용은 https://groups.google.com/forum/#!topic/golang-nuts/TByzyPgoAQE 를 참조하십시오.
go test
구성 파일이 아닌 테스트를 복잡하게하는 것처럼 보입니다 ( 플래그를 전달하지 못함).
*FlagName = value
Ini와 유사한 파일을 사용 하는 Gcfg 를 사용 하기 시작했습니다 . 간단합니다-간단한 것을 원한다면 좋은 선택입니다.
현재 사용중인 로딩 코드는 다음과 같습니다. 기본 설정이 있으며 일부 구성을 재정의하는 명령 줄 플래그 (표시되지 않음)를 허용합니다.
package util
import (
"code.google.com/p/gcfg"
)
type Config struct {
Port int
Verbose bool
AccessLog string
ErrorLog string
DbDriver string
DbConnection string
DbTblPrefix string
}
type configFile struct {
Server Config
}
const defaultConfig = `
[server]
port = 8000
verbose = false
accessLog = -
errorLog = -
dbDriver = mysql
dbConnection = testuser:TestPasswd9@/test
dbTblPrefix =
`
func LoadConfiguration(cfgFile string, port int, verbose bool) Config {
var err error
var cfg configFile
if cfgFile != "" {
err = gcfg.ReadFileInto(&cfg, cfgFile)
} else {
err = gcfg.ReadStringInto(&cfg, defaultConfig)
}
PanicOnError(err)
if port != 0 {
cfg.Server.Port = port
}
if verbose {
cfg.Server.Verbose = true
}
return cfg.Server
}
// load
config, _ := gonfig.FromJson(myJsonFile)
// read with defaults
host, _ := config.GetString("service/host", "localhost")
port, _ := config.GetInt("service/port", 80)
test, _ := config.GetBool("service/testing", false)
rate, _ := config.GetFloat("service/rate", 0.0)
// parse section into target structure
config.GetAs("service/template", &template)
https://github.com/spf13/viper 및 https://github.com/zpatrick/go-config 는 구성 파일을위한 매우 좋은 라이브러리입니다.
사용 toml 이 문서와 같은 읽기 설정은 이동 방법을 파일
golang에 간단한 ini 구성 라이브러리를 작성했습니다.
고 루틴 안전하고 사용하기 쉬운
package cfg
import (
"testing"
)
func TestCfg(t *testing.T) {
c := NewCfg("test.ini")
if err := c.Load() ; err != nil {
t.Error(err)
}
c.WriteInt("hello", 42)
c.WriteString("hello1", "World")
v, err := c.ReadInt("hello", 0)
if err != nil || v != 42 {
t.Error(err)
}
v1, err := c.ReadString("hello1", "")
if err != nil || v1 != "World" {
t.Error(err)
}
if err := c.Save(); err != nil {
t.Error(err)
}
}
=================== 업데이트 ========================
최근에 섹션을 지원하는 INI 파서가 필요하며 간단한 패키지를 작성합니다.
github.com/c4pt0r/cfg
"flag"패키지를 사용하는 것처럼 INI를 구문 분석 할 수 있습니다.
package main
import (
"log"
"github.com/c4pt0r/ini"
)
var conf = ini.NewConf("test.ini")
var (
v1 = conf.String("section1", "field1", "v1")
v2 = conf.Int("section1", "field2", 0)
)
func main() {
conf.Parse()
log.Println(*v1, *v2)
}
당신은 또한에 관심이있을 수 있습니다 범용 구성 언어 인 UCL에 대한 Go 바인딩 세트 인 go-libucl에 . UCL은 JSON과 비슷하지만 사람을 더 잘 지원합니다. 주석과 SI 승수 (10k, 40M 등)와 같은 사람이 읽을 수있는 구문을 지원하며 보일러 플레이트 (예 : 키 주위 인용 부호)가 약간 줄어 듭니다. 이미 익숙하다면 nginx 구성 파일 형식에 가깝습니다.
니모에 동의합니다 하고 모든 것을 쉽게 만들 수있는 작은 도구를 썼습니다.
bitbucket.org/gotamer/cfg 는 json 구성 패키지입니다
예제는 doc.go를 참조하십시오
JSON을 사용해 보았습니다. 효과가있었습니다. 그러나 나는 내가 설정할 정확한 필드와 유형의 구조체를 만들어야하는 것을 싫어합니다. 나에게 그것은 고통이었다. 내가 찾은 모든 구성 옵션이 사용하는 방법이라는 것을 알았습니다. 역동적 인 언어에 대한 나의 배경이 그런 장황함의 이점에 대해 눈을 멀게 할 수도 있습니다. 새로운 간단한 구성 파일 형식을 만들고 더 역동적 인 lib를 작성했습니다.
https://github.com/chrisftw/ezconf
나는 Go 세계에 익숙하지 않아 Go Go가 아닐 수도 있습니다. 그러나 그것은 효과적이고 매우 빠르며 사용하기가 매우 간단합니다.