@@ -0,0 +1,109 @@
|
||||
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"
|
||||
}
|
||||
Reference in New Issue
Block a user