Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- springboot
- loadimpact
- opensouce
- 글쓰기가필요하지않은인생은없다
- Algorithm
- organizeImports
- 오큘러스퀘스트2
- ProxyServer
- pyenv
- goalng
- httppretty
- typevar
- codewars
- printer_helper
- flake8
- restfulapi
- codewar
- 조엘온소프트웨어
- GlobalInterprintLock
- 규칙없음
- 독후감
- 유닉스의탄생
- maxlinelength
- Lint
- 코로나백신
- conf
- python
- pep8
- Golang
- vscode
Archives
- Today
- Total
일상적 이야기들.
Conf, Init 파일 사용하기 본문
Ini
- 프로그램 구동시 가장 먼저 Load 되어야할 정보들을 기록해둔다.
- Section, Key 로 구성이 되어있다.
[property]
path = "/Users/everspin/Public/company/next_gen_server_library_go/policy"
fileName = "property.ini"
- [] 는 Secion을 의미한다.
- 하위는 Secion의 key를 의미한다.
Code
go get gopkg.in/ini.v1
package main
import "gopkg.in/ini.v1"
func main() {
cfg, err := ini.Load("setting.ini")
if err != nil {
fmt.Println(err)
}
propertySection := cfg.Section("property")
path, fileName := propertySection.Key("path").String(), propertySection.Key("fileName").String()
}
- xxSection := cfg.Section("가져올 Section의 keyword")
- xxSection.Key("가져올 key값").[Type을 정의]
- xxSection.Key("path").String()
- xxSection.Key("SomeIntValue).Int()
Conf
Conf 의 형태를 json 혹은 yaml 이라고 가정을 한다.
- json.Marshal(), json.Unmarshal()
- yaml.Marshal(), yaml.Unmarshal()
여기서는 json 형태의 Conf 파일을 정의한다.
{
"AppInfo": {
"addID":"AppID3",
"uuid":"UUID"
},
"PolicyInfo": {
"blah":"Blah",
"blahBlah":"BlahBlah"
}
}
type AppInfo struct {
AppID string `json:"addID"`
UUID string `json:"uuid"`
}
type PolicyInfo struct {
Blah string `json:"blah"`
BlahBlah string `json:"blahBlah"`
}
type Property struct{
AppInfo AppInfo
PolicyInfo PolicyInfo
}
json 형태를 받아줄 수 있는 golang의 Structure를 정의를 한다.
json: "xxx"
은 실제 json으로 저장될 때 표기될 대소문자구분의 문자열을 의미한다.
package main
func main() {
payload := `{"appInfo":{"addID":"AppID3","uuid":"UUID"},"PolicyInfo":{"blah":"Blah","blahBlah":"BlahBlah"}}`
propertyManager := manager.PropertyManager{}
propertyManager.Initialize(path, fileName)
propertyManager.Save(payload)
fmt.Println(propertyManager.Load())
}
package conf
import (
"encoding/json"
"errors"
"fmt"
"io/ioutil"
"os"
)
type PropertyManager struct {
path string
fileName string
}
type AppInfo struct {
AppID string `json:"addID"`
UUID string `json:"uuid"`
}
type PolicyInfo struct {
Blah string `json:"blah"`
BlahBlah string `json:"blahBlah"`
}
type Property struct{
AppInfo AppInfo `json:"appInfo"`
PolicyInfo PolicyInfo
}
func (p *PropertyManager) Initialize(path string, fileName string) {
p.path = path
p.fileName = fileName
}
func (p *PropertyManager) Save(info string) {
var propertyInfo Property
saveFileName := fmt.Sprintf("%s/%s", p.path, p.fileName)
// Check byte information.
if err := json.Unmarshal([]byte(info), &propertyInfo); err != nil {
panic(err)
}
// for pretty print
e, _ := json.MarshalIndent(&propertyInfo, "", "\t")
existsProperty, err := p.Load()
if err == nil && existsProperty == string(e){
fmt.Println("Already saved")
return
}
if err == nil && existsProperty != string(e) {
if err := os.Rename(saveFileName, saveFileName + ".bak"); err != nil {
panic(err)
}
}
if err := ioutil.WriteFile(saveFileName, e, 0644); err != nil {
panic(err)
}
}
func (p *PropertyManager) Load() (string, error) {
var propertyInfo Property
bytes, err := ioutil.ReadFile(fmt.Sprintf("%s/%s", p.path, p.fileName))
if err != nil {
return "", errors.New("not exists ini file")
}
if err = json.Unmarshal(bytes, &propertyInfo); err != nil {
panic(err)
}
return string(bytes), nil
}
Property에 대한 정의는 Sample로 구성을 함.
Save
- 기존의 데이터가 있는지 확인하여 불러온다.
- 있다면, 기존 데이터가 현재 수신된 데이터와 동일한지 확인을 한다.
- 동일한 데이터라면, 굳이 저장을 할 필요가 없으므로 Log를 찍고 종료한다.
- 동일하지 않다면, 기존의 데이터를 .bak으로 옮긴다.
- 있다면, 기존 데이터가 현재 수신된 데이터와 동일한지 확인을 한다.
- 데이터를 저장한다.
Load
- 데이터를 불러온다.
- 없다면 Error를 Return 한다.
- Golang은 Excetpion을 발생시키기보다는 error return이 일반적인 것으로 보인다.
'프로그래밍 > GOLang' 카테고리의 다른 글
LoadImpact/K6 (0) | 2021.07.28 |
---|
Comments