110 lines
2.1 KiB
Go
110 lines
2.1 KiB
Go
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"
|
|
}
|