在使用go来开发跨平台应用的时候,比如配置文件的路径,我们希望设置一个默认值,windows下的路径是类似 d:\myapp\app.conf 这样的, unix系统中的路径是 /opt/myapp/app.conf 这样的, 而我们在使用的时候需要使用的是同一个变量名来代表他们, 那么就要把 //go:build 这个请出来了, 他可以根据不同的平台来编译对应的go文件。
对于这类的信息我们一般只是模块内使用,那最好是是使用 internal文件夹来保护一下,如我们假设有如下2个文件来保存我们的默认配置信息:
internal/vars/defaults_notwin.go
internal/vars/defaults_windows.go
这2个文件内容如下:
defaults_notwin.go
//go:build !windows
// 非windows系统编译package varsvar (DefaultConfigFile = "/opt/myapp/app.conf")
defaults_windows.go
package varsimport ("os"
)var (DefaultConfigFile = os.Getenv("SYSTEMDRIVE") + `\myapp\app.conf`
)
可见他们的包名一样,2个文件里面定义的变量名也是一样的, 而我们的编译器却不会报错,这个是为什么呢?
细心的你应该看出,在第一个文件defaults_notwin.go 的开头 有1行"注释" //go:build !windows
注意,在//后面没有空格,这个是go里面的特殊用法,而注释通常在//后面是有一个空格的
这个地方的 //go:build !windows 表示告诉编译器 当前文件在非windows系统时编译,而另外一个文件 defaults_windows.go 就只会在windows系统时才会编译, 则就保证了同一个包中使用了2个同名变量而不会报错。
我们在代码中要使用这个变量的时候就可以直接使用 confFileDefault := vars.DefaultConfigFile 而不用考虑当前平台是windows还是unix了。