最近go语言项目中用到读取配置文件,如下:
使用这个"github.com/BurntSushi/toml"
配置文件如下:conf.toml
# id
ID = 1
# name
Name = "name1"
# weight
Weight = 1.7
# books
Books = ["a", "b", "c"]
Sex = true
#friend Friend都可以
[friend]
Age = 32
Name = "xio"
代码如下 readConf.go:
package conf
import (
"fmt"
"github.com/BurntSushi/toml"
"io/ioutil"
"os"
)
// person
type Person struct {
ID uint32
Sex bool
Name string
Weight float32
Friend *Friends
Books []string
}
// friends
type Friends struct {
Age int
Name string
}
func ReadConf(fname string) (p *Person, err error) {
var (
fp *os.File
fcontent []byte
)
p = new(Person) // &Person{}
if fp, err = os.Open(fname); err != nil {
fmt.Println("open error ", err)
return
}
if fcontent, err = ioutil.ReadAll(fp); err != nil {
fmt.Println("ReadAll error ", err)
return
}
if err = toml.Unmarshal(fcontent, p); err != nil {
fmt.Println("toml.Unmarshal error ", err)
return
}
return
}
测试代码如下 readConf_test.go:
package conf
import "testing"
func TestReadConf(t *testing.T) {
p, err := ReadConf("./conf.toml")
if err != nil {
t.Logf("%v", err)
}
t.Logf("person %v", p)
t.Logf("person.friend %v", p.Friend)
}
输出结果为:
[ `go test -v` | done: 2.6748515s ]
=== RUN TestReadConf
--- PASS: TestReadConf (0.00s)
readConf_test.go:11: person &{1 true name1 1.7 0x1218c570 [a b c]}
readConf_test.go:12: person.friend &{32 xio}
PASS
ok goProgram/conf 0.458s
细节点:
1 结构体的成员首字母大写
2 配置文件的配置项须与结构体成员名一样
3 支持bool, int, float , 字符串,字符串数组...等,也可以包含其他结构体 如[Friend]
附:学习链接
https://item.congci.com/-/content/toml-ji-jian-de-peizhiwenjian-geshi
https://github.com/toml-lang/toml