通过 `init()` 函数在包加载时一次性解析环境变量并初始化全局布尔变量,避免每次调用函数时重复读取与转换,兼顾性能与简洁性。
在 Go 中,全局变量的初始化表达式仅支持编译期常量或简单赋值(如字面量、函数调用返回单个值),而 strconv.ParseBool(os.Getenv("MYVAR")) 这类依赖运行时环境、可能引发错误的复合操作不能直接用于变量声明初始化——这正是原代码报错的根本原因。
正确的做法是将环境变量的读取与解析逻辑移至 init() 函数中。init() 是 Go 的特殊函数,每个包在程序启动、main() 执行前自动运行一次,且保证在任何包级变量使用前完成,非常适合执行一次性初始化任务。
以下是一个完整、健壮的实现示例:
package mylib
import (
"fmt"
"os"
"strconv"
)
// 全局变量(未初始化)
var (
myvar string
myvarbool bool
myvarErr error // 建议保留错误,便于调试
)
func init() {
myvar = os.Getenv("MYVAR")
myvarbool, myvarErr = strconv.ParseBool(myvar)
// 可选:日志提示或 panic(仅开发/关键配置场景)
// if myvarErr != nil {
// panic(fmt.Sprintf("invalid MYVAR value %q: %v", myvar, myvarErr))
// }
}
// Utility function to check for value
func MyCheck() {
if myvarErr != nil {
fmt.Printf("Warning: MYVAR not set or invalid (%v), defaulting to false\n", myvarErr)
return
}
if myvarbool {
fmt.Print("MYVAR is true")
} else {
fmt.Print("MYVAR is false")
}
}✅ 关键优势:

⚠️ 注意事项:
该方案既满足了“一次初始化、多次使用”的需求,又保持了 Go 代码的清晰性与可靠性。