지금까지 특정 함수 구현이 용도에 따라 다르게 구현해야하는 경우 환경 변수를 받아와 함수 내부에서 분기문으로 처리했었습니다.
하지만 해당 방식의 경우 매번 분기문이 들어갈 뿐 아니라 특정 용도로 사용하기 위해 컴파일한 바이너리에도 모든 용도의 코드가 들어가게 됩니다.
그렇기에 더 나은 방법을 찾다가 go build tags 기능을 알게되었습니다.
go build tags 기능은 go 코드를 컴파일할 때 컴파일 옵션을 통하여 특정 파일이 컴파일 될 때 사용될 수 있도록 설정할 수 있습니다.
대표적으로 OS 라이브러리를 사용하여 파일을 읽어오는 기본 함수의 경우 build tags 로 OS 의 이름을 주어 컴파일러가 구분하여 컴파일을 하게 됩니다.
이 때, OS 혹은 CPU 아키텍쳐와 같은 모든 상황에 사용되는 build tags 의 경우 사용자가 별도로 정의하지 않아도 빌드 시 정보가 전달됩니다.
go version go1.19 darwin/amd64
과거 버전의 go build tags 의 경우
//+build <tags>형태였으나 현재//go:build <tags>를 권장하고 있습니다.
package main
func main() {
PrintMode()
}
//go:build case1
package main
import "fmt"
func PrintMode() {
fmt.Println("Case1")
}
//go:build !case1
package main
import "fmt"
func PrintMode() {
fmt.Println("Non Case1")
}
$ go run .
Non Case1
$ go run -tags case1 .
Case1
위 main.go case1.go noncase1.go 파일은 모두 서로 다른 파일로 저장해야하며 build tags 는 파일 최상단에 위치해야합니다.