配置文件
func main() {
c := &config.Config{
App: config.ApplicationConfig{
Port: 8080,
},
DB: config.DBConfig{
FileName: "test.db",
DSN: "test_user:test_pass@tcp(127.0.0.1:3306)/lr_book?charset=utf8mb4&parseTime=True&loc=Local",
},
}
...
}
你可能已经注意到了,硬编码的配置项是潜在的安全漏洞。而且一旦构建部署后,开发人员也很难改动控制它。
所以,你需要一个单独的配置文件。
添加 config.yml:
app:
port: 8080
db:
file_name: "test.db"
dsn: "test_user:test_pass@tcp(127.0.0.1:3306)/lr_book?charset=utf8mb4&parseTime=True&loc=Local"
添加 yaml
依赖:
go get -u gopkg.in/yaml.v3
添加 Parse
函数,在 infrastructure/config/config.go 中:
package config
+import (
+ "fmt"
+ "os"
+
+ "gopkg.in/yaml.v3"
+)
+
type Config struct {
App ApplicationConfig `json:"app" yaml:"app"`
DB DBConfig `json:"db" yaml:"db"`
@@ -13,3 +20,17 @@ type DBConfig struct {
type ApplicationConfig struct {
Port int `json:"port" yaml:"port"`
}
+
+// Parse 解析配置文件并返回 Config。
+func Parse(filename string) (*Config, error) {
+ buf, err := os.ReadFile(filename)
+ if err != nil {
+ return nil, err
+ }
+ c := &Config{}
+ err = yaml.Unmarshal(buf, c)
+ if err != nil {
+ return nil, fmt.Errorf("failed to parse file %s: %v", filename, err)
+ }
+ return c, nil
+}
在 main.go 中使用 config.Parse
:
@@ -8,16 +8,15 @@ import (
"literank.com/rest-books/infrastructure/config"
)
+const configFileName = "config.yml"
+
func main() {
- c := &config.Config{
- App: config.ApplicationConfig{
- Port: 8080,
- },
- DB: config.DBConfig{
- FileName: "test.db",
- DSN: "test_user:test_pass@tcp(127.0.0.1:3306)/lr_book?charset=utf8mb4&parseTime=True&loc=Local",
- },
+ // Read the config
+ c, err := config.Parse(configFileName)
+ if err != nil {
+ panic(err)
}
+
// Prepare dependencies
wireHelper, err := application.NewWireHelper(c)
if err != nil {
硬编码的配置项被移到了 config.yml
中。不错!