golinux配置⽂件,Golang项⽬之配置⽂件
相信对于很多gopher ⽽⾔, 我这篇⽂章,算⽐较初级,我是⼀个⼀年多经验的golang程序员,有着5年左右的编程经验。
golang 对于初学者还算友好, 写代码很好⼊门, 但业界对于golang⼯程与项⽬的BP却⽐较缺少,或者是有很多⽅为此争论不休,就⽐依赖管理⼯具就搞出了许多个,如 知名的有dep, vgo和golang 官⽅的 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
properties ⽂件对于很多Java程序员应该不陌⽣,因为在很多spring项⽬中, 会经常见到这种⽂件,当然没有⽤到过的夜别打我,这种完全看兴趣爱好的, ⼀个简单的⽂件格式如下:
addr=localhost
port=3306
复制代码
Golang 的配置⽂件
golang 项⽬为什么要配置⽂件
对于很多配置相关的项如监听的端⼝、数据库的地址、端⼝等会⽐较适合放在配置中,⽽不是硬编码在代码中,因此配置⽂件的使⽤还是⽐较常见的。
对于使⽤什么类型的配置⽂件⼤家不需要纠结,根据需求就好了,
配置⽂件需要应对的⼏种场景
IDE运⾏/调试时期读取配置⽂件
运⾏单测或者benchmark Test的时候读取配置⽂件
可执⾏⽂件(部署⽂件)读取配置⽂件
西班牙vs德国现场直播项⽬中需要仅使⽤⼀个配置⽂件,配置⽂件可以在以上三种情况下都可以被正常读取
配置⽂件的放置
⼀般配置⽂件会放在项⽬的根⽬录或者⽐较明显的位置,当然对于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), 此函数可以返回源代码所在⽬录,但根据参数的不同,对于调⽤的位置要求也不同,这⾥设置的刚好可以满⾜放在项⽬根⽬录的需求
⼀个开源项⽬
项⽬地址喜欢的话点个赞(star), 有问题的话可以提issue. 以联系我。
获取的⽅式如下
go get github/winjeg/goconf
复制代码
此项⽬采⽤go module作为依赖管理⽅式,但也兼容于传统的dep作为依赖管理⼯具
⽀持的格式
yaml格式
ini 格式
使⽤实例
package goconf
import (
"strings"
"testing"
)
const (
testYmlFile = "test.yaml"
testIniFile = "test.ini"两位数以上的随机数字表
回文链表c语言完整代码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)properties是什么文件
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()
}
}
复制代码
qlv转mp4的app你只需要定义⾃⼰需要的配置结构, 指定⽂件名称即可正确读取到配置, 使⽤起来也⾮常简单, 推荐放在项⽬的根⽬录
读取顺序规则
先从可执⾏⽂件的运⾏⽬录读取配置⽂件
如果读取不到则从项⽬的源代码所在⽬录读取, 如果读取不到,则递归往根⽬录查,直到根⽬录为⽌
不到配置⽂件则会抛出错误,到则不会返回任何错误
写在最后
golang 的配置⽂件处理⽅式或许还有很多种,所以如果⼤家有其他⽐较好的法⼦也可以分享出来⼤家⼀起学习⼀起进步. 如有任何疑问,欢迎在下⽅留⾔评论,或者到上⾯我项⽬地址中去提issue.
此⽂如有转载,请勿修改原⽂内容.
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论