package utils import ( "os" "runtime" "strings" ) // OSInfo 操作系统信息 type OSInfo struct { OS string // 操作系统类型: windows, linux, darwin Arch string // 架构: amd64, arm64, 386 IsCGO bool // 是否支持 CGO DataDir string // 数据目录路径 } var currentOS *OSInfo // DetectOS 检测操作系统环境 func DetectOS() *OSInfo { if currentOS != nil { return currentOS } osType := runtime.GOOS arch := runtime.GOARCH // 检测 CGO 支持 // 注意:CGO 支持在编译时确定,运行时无法准确检测 // 这里通过检查环境变量或尝试使用 SQLite 来判断 isCGO := true // 如果设置了 CGO_ENABLED=0,则不支持 CGO if cgoEnv := os.Getenv("CGO_ENABLED"); cgoEnv == "0" { isCGO = false } // 确定数据目录 dataDir := "data" if osType == "windows" { // Windows 使用相对路径 dataDir = "data" } else { // Linux/macOS 使用相对路径 dataDir = "data" } currentOS = &OSInfo{ OS: normalizeOS(osType), Arch: normalizeArch(arch), IsCGO: isCGO, DataDir: dataDir, } return currentOS } // normalizeOS 标准化操作系统名称 func normalizeOS(os string) string { os = strings.ToLower(os) switch os { case "windows": return "windows" case "linux": return "linux" case "darwin": return "darwin" case "freebsd", "openbsd", "netbsd": return "unix" default: return "unknown" } } // normalizeArch 标准化架构名称 func normalizeArch(arch string) string { arch = strings.ToLower(arch) switch arch { case "amd64", "x86_64": return "amd64" case "386", "i386", "i686": return "386" case "arm64", "aarch64": return "arm64" case "arm": return "arm" default: return arch } } // GetOSInfo 获取操作系统信息 func GetOSInfo() *OSInfo { return DetectOS() } // IsWindows 判断是否为 Windows func IsWindows() bool { return DetectOS().OS == "windows" } // IsLinux 判断是否为 Linux func IsLinux() bool { return DetectOS().OS == "linux" } // IsDarwin 判断是否为 macOS func IsDarwin() bool { return DetectOS().OS == "darwin" }