» Go:使用Gin构建REST API » 2. 开发 » 2.7 配置文件

配置文件

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 中。不错!

上页下页