回答

收藏

如何在 Go 中可靠地检测操作系统/平台

技术问答 技术问答 456 人阅读 | 0 人回复 | 2023-09-12

这是我目前正在使用的。我认为它可以完成工作,但必须有更好的方法:% m) {1 z. p( W
    func isWindows() bool    return os.PathSeparator == '\\' && os.PathListSeparator == ';'}
    # W2 @2 w$ K8 z% K
就我而言,我只需要知道如何检测 Windows,但我想知道如何检测任何平台/操作系统。6 M0 O+ d$ d  v' h, K5 u& G% U
                                                                3 Q8 H, E. U* j8 i5 {- f9 S2 c
    解决方案:                                                                / [. V! w, \/ ]
                                                                编译时检测如果您这样做是为了根据操作系统实现不同,使用具有该功能的单独文件并将构建标记添加到每个文件中更有用。这在标准库的许多地方都有使用,例如os包中。
. z7 h& |% \8 `2 L这些所谓的“构建约束”或“构建标签”在此处进行了解释。& k, k& X, H5 V0 ~. E/ }
假设你有一个常量PATH_SEPARATOR如果你想依靠平台,你会制作两个文件,一个用于 Windows,一个用于 (UNIX) rest:
( ^/ ]; _- l7 D( h4 O# j! A+ k% Q
    /project/path_windows.go/project/path_unix.go
    ) z! c4 L& `$ u
这些文件的代码将是:
) k* M" N8 w* Z$ v& @' I% x: a6 m" kpath_windows.go
    //  build windowspackage projectconst PATH_SEPARATOR = '\\'
    , R; ~4 S8 J3 A% X
path_unix.go
    " a, q; R" [% x0 s0 A
  • //  build !windowspackage projectconst PATH_SEPARATOR = code]您现在可以访问PATH_SEPARATOR您的代码并使其依赖于平台。0 M, v& b+ H: y
  • 运行时检测在运行过程中确定操作系统,请使用runtime.GOOS 变量:[code]if runtime.GOOS == "windows"    fmt.Println("Hello from Windows")}0 A3 n0 ~# j, s+ h9 y' K3 l* S
虽然它运行过程中被编译并忽略了环境,但您仍然可以相对确定值是正确的。原因是每个值得区分的平台都需要重建,因为不同的可执行格式需要重建,从而有一个新的GOOS价值。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则