72 lines
1.6 KiB
Go
72 lines
1.6 KiB
Go
package env
|
||
|
||
import (
|
||
"runtime"
|
||
"strconv"
|
||
"syscall"
|
||
)
|
||
|
||
// IsWindows 判断当前系统是否是 Windows
|
||
func IsWindows() bool {
|
||
return runtime.GOOS == "windows"
|
||
}
|
||
|
||
// IsLinux 判断当前系统是否是 Linux
|
||
func IsLinux() bool {
|
||
return runtime.GOOS == "linux"
|
||
}
|
||
|
||
// IsMacOS 判断当前系统是否是 macOS
|
||
func IsMacOS() bool {
|
||
return runtime.GOOS == "darwin"
|
||
}
|
||
|
||
// IsMacIntel 判断当前 macOS 系统是否是 Intel 架构(x86_64)
|
||
// 非 macOS 系统返回 false
|
||
func IsMacIntel() bool {
|
||
if !IsMacOS() {
|
||
return false
|
||
}
|
||
|
||
// 先通过 GOARCH 快速判断,兼容绝大多数场景
|
||
if runtime.GOARCH == "amd64" {
|
||
// 验证硬件是否真的是 Intel(避免 Rosetta 兼容模式误判)
|
||
return !isAppleSiliconHardware()
|
||
}
|
||
return false
|
||
}
|
||
|
||
// IsMacArm 判断当前 macOS 系统是否是 ARM 架构(Apple Silicon/M1/M2/M3)
|
||
// 非 macOS 系统返回 false
|
||
func IsMacArm() bool {
|
||
if !IsMacOS() {
|
||
return false
|
||
}
|
||
|
||
// 场景1:原生 ARM 编译运行(GOARCH=arm64)
|
||
if runtime.GOARCH == "arm64" {
|
||
return true
|
||
}
|
||
|
||
// 场景2:Intel 编译但运行在 ARM macOS 的 Rosetta 兼容模式下
|
||
if runtime.GOARCH == "amd64" {
|
||
return isAppleSiliconHardware()
|
||
}
|
||
|
||
return false
|
||
}
|
||
|
||
// isAppleSiliconHardware 底层方法:判断 macOS 硬件是否是 Apple Silicon(ARM)
|
||
// 仅在 macOS 下调用有效,返回 true 表示 ARM 硬件,false 表示 Intel 硬件
|
||
func isAppleSiliconHardware() bool {
|
||
val, err := syscall.Sysctl("hw.optional.arm64")
|
||
if err != nil {
|
||
return false
|
||
}
|
||
num, err := strconv.Atoi(val)
|
||
if err != nil {
|
||
return false
|
||
}
|
||
return num == 1
|
||
}
|