如何使用Golang获取macOS版本并判断是否≥Big Sur
在Golang中获取macOS系统版本并判断是否≥Big Sur
方案1:调用系统sw_vers命令(纯Go,无需Cgo)
macOS自带的sw_vers命令可直接输出系统版本,通过Go的os/exec包执行该命令并解析结果即可,无需依赖第三方包或Cgo。
代码实现:
package main import ( "bufio" "fmt" "os/exec" "strconv" "strings" ) // GetMacOSVersion 获取macOS主版本号(如Big Sur返回11) func GetMacOSVersion() (int, error) { cmd := exec.Command("sw_vers", "-productVersion") stdout, err := cmd.StdoutPipe() if err != nil { return 0, err } if err := cmd.Start(); err != nil { return 0, err } scanner := bufio.NewScanner(stdout) var versionStr string if scanner.Scan() { versionStr = scanner.Text() } if err := scanner.Err(); err != nil { return 0, err } if err := cmd.Wait(); err != nil { return 0, err } // 拆分版本字符串,取主版本号(如"11.7.10"拆分为"11") parts := strings.Split(versionStr, ".") if len(parts) == 0 { return 0, fmt.Errorf("invalid version string: %s", versionStr) } majorVersion, err := strconv.Atoi(parts[0]) if err != nil { return 0, fmt.Errorf("failed to parse major version: %w", err) } return majorVersion, nil } func main() { majorVer, err := GetMacOSVersion() if err != nil { fmt.Printf("Error: %v\n", err) return } // Big Sur的主版本号是11 if majorVer >= 11 { fmt.Println("当前系统版本≥Big Sur") } else { fmt.Printf("当前系统主版本号为%d,低于Big Sur\n", majorVer) } }
方案2:Cgo调用系统API(无外部命令依赖)
如果不想依赖外部命令,可通过Cgo调用macOS官方的NSProcessInfo API(更可靠,避免sw_vers被篡改的风险)。该API从macOS 10.10开始可用,完全覆盖Big Sur及后续版本。
代码实现:
package main /* #cgo CFLAGS: -x objective-c #cgo LDFLAGS: -framework Foundation #include <Foundation/Foundation.h> int getMacOSMajorVersion() { NSOperatingSystemVersion version = [[NSProcessInfo processInfo] operatingSystemVersion]; return version.majorVersion; } */ import "C" import "fmt" func main() { majorVer := int(C.getMacOSMajorVersion()) if majorVer >= 11 { fmt.Println("当前系统版本≥Big Sur") } else { fmt.Printf("当前系统主版本号为%d,低于Big Sur\n", majorVer) } }
注意事项:
- 编译时需开启Cgo:
CGO_ENABLED=1 go build - 该代码仅能在macOS上编译运行,跨平台编译时需排除此逻辑
版本判断逻辑说明
Big Sur对应的macOS主版本号为11,后续Monterey(12)、Ventura(13)等版本主版本号均≥11,只需判断主版本号即可满足需求。
内容的提问来源于stack exchange,提问作者Baab
相关产品推荐
相关产品推荐

