Aprendí a generar ayer, y hoy aprendí otro punto de conocimiento, que también es un punto de conocimiento relacionado con las anotaciones. La compilación condicional de Golang también se llama restricciones de compilación.
Escenario de aplicación
La compilación condicional se puede reflejar en el código que se adapta a los sistemas operativos en diferentes plataformas. Las diferentes plataformas del sistema operativo tienen un soporte diferente para ciertas características, pero a menudo el código a nivel empresarial no prestará atención, por lo que se requiere cierta encapsulación del código subyacente. Por ejemplo, los directorios de inicio de Windows y Linux son diferentes, y nuestra empresa necesita leer el directorio de inicio, luego podemos usar la compilación condicional para lograr el efecto.
Dos formas de compilación condicional.
La compilación condicional se puede lograr de dos maneras:
- Agregue un comentario al comienzo del archivo fuente;
- Se implementa como un sufijo de nombre de archivo.
Al agregar comentarios
El formato del comentario es el siguiente:
// +build tags
Las etiquetas pueden ser un sistema operativo o una opción de compilador. Si hay algo que pueda completar, mire hacia atrás. Veamos un ejemplo para obtener una impresión general:
// +build windows
package main
import "fmt"
func echo() {
fmt.Print("windows")
}
// +build linux
package main
import "fmt"
func echo() {
fmt.Print("linux")
}
package main
func main() {
echo()
}
Escribí dos archivos, ambos tienen el método echo, y llamé al método echo en la función principal. Si se está ejecutando ahora, imprimirá "windows" en el entorno Windows y "linux" en el entorno Linux. Al ver esto, debería ser capaz de comprender aproximadamente qué es la compilación condicional y sus escenarios de aplicación.
Entonces, ¿qué hacemos cuando tenemos múltiples condiciones de compilación? Por ejemplo, en el entorno amd64 en Linux, ¿cómo deberían definirse las etiquetas? En los comentarios al principio del archivo fuente, puede haber múltiples definiciones de compilación, como:
// +build linux
// +build amd64
También se puede escribir así
// +build linux,amd64
La lógica separada por comas es la lógica de "y", y la lógica separada por un espacio es la lógica de "o", vea el siguiente ejemplo:
// +build linux,cgo darwin,cgo
Esto significa que en el entorno Linux o Apple, compile con cgo.
También es importante tener en cuenta que debe dejar una línea en blanco después del comentario. Si desea indicar que puede compilar mientras no esté en el entorno de Windows, debe escribir esto:
// +build !windows
Si las etiquetas detrás de + build no están definidas, se ignorarán durante la compilación, por ejemplo:
// +build abc
Ahora veamos qué etiquetas podemos llenar. De la documentación oficial, podemos ver las siguientes opciones:
- 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
- "go1.7", from Go version 1.7 onward
- "go1.8", from Go version 1.8 onward
- "go1.9", from Go version 1.9 onward
- "go1.10", from Go version 1.10 onward
- "go1.11", from Go version 1.11 onward
- "go1.12", from Go version 1.12 onward
- "go1.13", from Go version 1.13 onward
- "go1.14", from Go version 1.14 onward
- any additional words listed in ctxt.BuildTags
Nombra el sufijo en el archivo
El método de denominación de archivos es relativamente simple y puede compilarse condicionalmente con las siguientes formas de denominación:
*_GOOS //如:file_linux.go,表示只在Linux下编译
*_GOARCH //如:file_amd64.go,表示只在amd64下编译
*_GOOS_GOARCH //如:file_linux_amd64.go,表示只在Linux且amd64下编译
Bienvenido a prestar atención a mi número público: onepunchgo, déjame un mensaje.