Golang构建时如何传递配置参数

Golang构建时如何传递配置参数 我有不同类型的配置参数,取决于JSON文件中的环境 例如:测试环境、生产环境、本地环境

我能够通过IntelliJ Goland在运行/调试配置中将这些参数作为环境变量传递 但不确定在使用go build命令时如何通过终端实现 任何帮助都将不胜感激。以下是IntelliJ的截图

16%20 PM

2 回复

尝试使用 go help build 命令:

$ go help build
usage: go build [-o output] [-i] [build flags] [packages]
[…]

更多关于Golang构建时如何传递配置参数的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


在Go构建时传递配置参数有多种方式,下面介绍几种常用的方法:

1. 使用构建标签(Build Tags)

创建不同环境的配置文件:

// app.go
package main

import "fmt"

func main() {
    config := getConfig()
    fmt.Printf("Environment: %s\n", config.Environment)
    fmt.Printf("Database URL: %s\n", config.DatabaseURL)
}

// config.go
// +build dev

package main

type Config struct {
    Environment string
    DatabaseURL string
}

func getConfig() Config {
    return Config{
        Environment: "development",
        DatabaseURL: "localhost:5432/dev",
    }
}
// config_prod.go
// +build prod

package main

func getConfig() Config {
    return Config{
        Environment: "production",
        DatabaseURL: "postgresql://prod-server:5432/prod",
    }
}

构建命令:

# 开发环境
go build -tags dev -o app

# 生产环境
go build -tags prod -o app

2. 使用环境变量

package main

import (
    "fmt"
    "os"
)

type Config struct {
    Environment string
    DatabaseURL string
    Port        string
}

func loadConfig() Config {
    env := os.Getenv("APP_ENV")
    if env == "" {
        env = "development"
    }
    
    return Config{
        Environment: env,
        DatabaseURL: os.Getenv("DATABASE_URL"),
        Port:        os.Getenv("PORT"),
    }
}

func main() {
    config := loadConfig()
    fmt.Printf("Running in %s environment\n", config.Environment)
    fmt.Printf("Database: %s\n", config.DatabaseURL)
    fmt.Printf("Port: %s\n", config.Port)
}

构建和运行:

# 构建
go build -o app

# 运行(开发环境)
APP_ENV=development DATABASE_URL=localhost:5432/dev PORT=8080 ./app

# 运行(生产环境)
APP_ENV=production DATABASE_URL=postgresql://prod:5432/app PORT=80 ./app

3. 使用ldflags注入版本信息

package main

import "fmt"

var (
    version    = "dev"
    buildTime  = "unknown"
    environment = "development"
)

func main() {
    fmt.Printf("Version: %s\n", version)
    fmt.Printf("Build Time: %s\n", buildTime)
    fmt.Printf("Environment: %s\n", environment)
}

构建命令:

go build -ldflags "\
    -X main.version=1.0.0 \
    -X main.buildTime=$(date +%Y-%m-%dT%H:%M:%S) \
    -X main.environment=production" \
    -o app

4. 使用配置文件(推荐)

创建配置文件结构:

config/
├── config.go
├── development.json
└── production.json
// config/config.go
package config

import (
    "encoding/json"
    "fmt"
    "os"
)

type Config struct {
    Environment string `json:"environment"`
    DatabaseURL string `json:"database_url"`
    Port        int    `json:"port"`
    Debug       bool   `json:"debug"`
}

func Load(env string) (*Config, error) {
    filename := fmt.Sprintf("config/%s.json", env)
    data, err := os.ReadFile(filename)
    if err != nil {
        return nil, err
    }
    
    var config Config
    if err := json.Unmarshal(data, &config); err != nil {
        return nil, err
    }
    
    return &config, nil
}
// config/development.json
{
    "environment": "development",
    "database_url": "localhost:5432/dev",
    "port": 8080,
    "debug": true
}
// config/production.json
{
    "environment": "production",
    "database_url": "postgresql://prod-server:5432/prod",
    "port": 80,
    "debug": false
}

主程序:

package main

import (
    "fmt"
    "os"
    "your-app/config"
)

func main() {
    env := os.Getenv("APP_ENV")
    if env == "" {
        env = "development"
    }
    
    cfg, err := config.Load(env)
    if err != nil {
        panic(fmt.Sprintf("Failed to load config: %v", err))
    }
    
    fmt.Printf("Running in %s environment\n", cfg.Environment)
    fmt.Printf("Database: %s\n", cfg.DatabaseURL)
    fmt.Printf("Port: %d\n", cfg.Port)
}

使用方式:

# 构建
go build -o app

# 运行不同环境
APP_ENV=development ./app
APP_ENV=production ./app

这些方法可以根据具体需求选择使用,环境变量方式最为灵活,适合容器化部署场景。

回到顶部