在 Windows 系统中,SET GOOS=linux和go env -w GOOS=linux都可以用于设置 Go 语言编译时的目标操作系统环境变量,但它们在多个方面存在区别:
-
作用范围
SET GOOS=linux:这是在 Windows 命令提示符(CMD)中设置环境变量的方式,其作用范围仅限于当前的命令提示符窗口或当前会话。如果打开新的命令提示符窗口或终端会话,需要重新设置此变量,新会话才会具有该环境变量。go env -w GOOS=linux:使用go env -w设置的环境变量会被写入到 Go 环境配置文件中(通常是%USERPROFILE%\go\env文件),它的作用范围是整个系统中所有与 Go 相关的操作,除非被再次修改或删除,否则在任何新的命令提示符窗口、PowerShell 窗口或其他终端会话中运行 Go 命令时,该环境变量都会生效。
-
变量持久性
SET GOOS=linux:当关闭设置该变量的命令提示符窗口或会话结束时,所设置的GOOS环境变量就会丢失。下次再打开新的窗口使用时,需要重新设置。go env -w GOOS=linux:由于是将环境变量写入配置文件,所以具有持久性。即使系统重启后,只要 Go 环境配置文件没有被修改或删除,该环境变量依然会存在并生效。
-
对 Go 环境的影响
SET GOOS=linux:只是临时设置了GOOS环境变量,仅对当前会话中后续执行的 Go 命令产生影响,不会改变 Go 环境的全局配置。go env -w GOOS=linux:会修改 Go 环境的配置,不仅影响当前会话中的 Go 命令,还会影响到系统中所有使用 Go 环境的地方。例如,在设置后,无论在哪个目录下执行 Go 构建或其他相关操作,都会以设置的GOOS值作为目标操作系统进行编译等操作。
-
适用场景
SET GOOS=linux:适用于只需要在当前命令会话中临时改变 Go 编译的目标操作系统,而不希望对整个系统的 Go 环境配置产生持久影响的情况。比如,临时需要构建一个适用于 Linux 的可执行文件,而后续在其他会话中仍希望按照默认的 Windows 环境进行编译。go env -w GOOS=linux:当需要长期固定地将 Go 编译的目标操作系统设置为 Linux,或者在多个不同的命令会话和项目中都需要统一以 Linux 为目标进行编译时,使用go env -w来设置环境变量更为合适,这样可以确保整个系统中的 Go 环境都按照指定的目标操作系统进行配置。