如何在编译时定义常量

Sir*_*ius 0 go

我知道我可以在 Go 中对变量使用编译器标志,但是如何对常量执行此操作?

我想在编译时设置一些常量,例如数据库集,如下所示:

package db_info

var Deploy string

const DbType   = "mysql"
const DbUser   = "my_user"
const Db       = "my_db"
const DbPort   = "3306"

if Deploy == "staging" {
    const DbPassword = "my_pwd_stg"
    const DbHost     = "db.url.com"
} else if Deploy == "production" {
    const DbPassword = "my_pwd_prd"
    const DbHost     = "db.url.com"
} else {
    const DbPassword = "pwd"
    const DbHost     = "127.0.0.1"
}
Run Code Online (Sandbox Code Playgroud)

如何正确地做到这一点?就像我得到的:

syntax error: non-declaration statement outside function body
Run Code Online (Sandbox Code Playgroud)

Grz*_*Żur 6

你不能这样做。它将违反范围规则。您可能希望这些常量是全局可见的,但它们是在块中定义的。


我只是将这些值作为程序参数或环境变量传递。


另一方面,正如您提到的,您可以在编译时修改字符串变量。用来-ldflags做它。

go run -ldflags="-X main.who=Something" hello.go
Run Code Online (Sandbox Code Playgroud)

package main

import "fmt"

var who = "World"

func main() {
    fmt.Printf("Hello, %s.\n", who)
}
Run Code Online (Sandbox Code Playgroud)

请参阅https://blog.cloudflare.com/setting-go-variables-at-compile-time/