Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我可以基于操作系统I'导入Golang软件包吗;我在为你建房子?_Go_Upstart_Launchd_Systemd_Sysv - Fatal编程技术网

我可以基于操作系统I'导入Golang软件包吗;我在为你建房子?

我可以基于操作系统I'导入Golang软件包吗;我在为你建房子?,go,upstart,launchd,systemd,sysv,Go,Upstart,Launchd,Systemd,Sysv,假设我有一个go项目,它基于哪个操作系统,在某些情况下基于哪个发行版,我想使用Systemd客户端包vs Upstart客户端包vs sysv客户端包vs launchd客户端包。是否可以有选择地导入每个包,以便我只导入每个操作系统/发行版所需的包?或者我必须为每个操作系统/发行版导入每个包吗 构建约束(也称为构建标记)是一个行注释,用于 开始 它列出了文件应包含在中的条件 包裹约束可能出现在任何类型的源文件中(不仅仅是 Go),但它们必须出现在文件顶部附近,前面只有 空行和其他行注释。这些

假设我有一个go项目,它基于哪个操作系统,在某些情况下基于哪个发行版,我想使用Systemd客户端包vs Upstart客户端包vs sysv客户端包vs launchd客户端包。是否可以有选择地导入每个包,以便我只导入每个操作系统/发行版所需的包?或者我必须为每个操作系统/发行版导入每个包吗

构建约束(也称为构建标记)是一个行注释,用于 开始

它列出了文件应包含在中的条件 包裹约束可能出现在任何类型的源文件中(不仅仅是 Go),但它们必须出现在文件顶部附近,前面只有 空行和其他行注释。这些规则意味着在Go文件中 生成约束必须出现在package子句之前

为了区分构建约束和包文档,一系列 生成约束的后面必须有一个空行

构建约束被评估为空间分隔选项的OR; 每个选项的计算结果都是其逗号分隔项的和;和 每个术语都是一个字母数字单词,或前面有!,它的否定。 也就是说,构建约束:

// +build linux,386 darwin,!cgo
// +build !linux,!darwin !cgo
对应于布尔公式:

(linux AND 386) OR (darwin AND (NOT cgo))
(linux OR darwin) AND 386
一个文件可能有多个生成约束。总的限制是 单个约束的和。即,构建约束:

// +build linux darwin
// +build 386
对应于布尔公式:

(linux AND 386) OR (darwin AND (NOT cgo))
(linux OR darwin) AND 386
在特定构建过程中,满足以下条件:

- the target operating system, as spelled by runtime.GOOS
- the target architecture, as spelled by runtime.GOARCH
- the compiler being used, either "gc" or "gccgo"
- "cgo", if ctxt.CgoEnabled is true
- "go1.1", from Go version 1.1 onward
- "go1.2", from Go version 1.2 onward
- "go1.3", from Go version 1.3 onward
- "go1.4", from Go version 1.4 onward
- "go1.5", from Go version 1.5 onward
- "go1.6", from Go version 1.6 onward
- any additional words listed in ctxt.BuildTags
如果是文件名,在剥离扩展名和可能的_测试之后 后缀,匹配以下任何模式:

*_GOOS
*_GOARCH
*_GOOS_GOARCH
(示例:source_windows_amd64.go)其中GOOS和GOARCH表示任何 分别已知操作系统和体系结构值,然后 文件被认为具有隐式生成约束,需要 这些术语(除了文件中的任何显式约束)

要避免生成时考虑文件,请执行以下操作:

// +build ignore
(任何其他不满意的词也可以,但“忽略”是 传统的。)

要仅在使用cgo且仅在Linux和OS X上构建文件,请执行以下操作:

// +build linux,cgo darwin,cgo
这样的文件通常与实现 其他系统的默认功能,在本例中 进行约束:

// +build linux,386 darwin,!cgo
// +build !linux,!darwin !cgo
命名文件dns_windows.go将导致仅当 构建Windows软件包;同样,math_386.s也将是 仅在为32位x86构建包时包含

使用GOOS=android与中的GOOS=linux一样匹配构建标记和文件 添加到android标签和文件

使用构建约束

使用包含多个文件的单个包。每个文件专门用于特定的操作系统、体系结构等组合

构建约束被评估为空间分隔选项的OR;每个选项的计算结果都是其逗号分隔项的和;每个术语都是一个字母数字单词或,前面有

事实上,这种情况将会改变(2021年第3季度)

//go:build
go
命令现在可以理解
///go:build
行,并且优先于
//+build

新语法使用布尔表达式,就像Go一样,应该不那么容易出错

从本版本起,新语法完全受支持,所有Go文件都应更新为具有相同含义的两种形式。
为了帮助迁移,
gofmt
现在自动同步这两个表单。
有关语法和迁移计划的更多详细信息,请参阅

从设计文件中:

设计的核心思想是用使用更熟悉的布尔表达式的新的
///go:build
行替换当前用于构建标记选择的
/+build

例如,旧语法

/+buildlinux
//+建造386
将被新语法替换

//go:buildlinux&&386