Golang Build Tag 로 용도에 따라 코드 분리하기

하설·2023년 8월 23일

상황

지금까지 특정 함수 구현이 용도에 따라 다르게 구현해야하는 경우 환경 변수를 받아와 함수 내부에서 분기문으로 처리했었습니다.
하지만 해당 방식의 경우 매번 분기문이 들어갈 뿐 아니라 특정 용도로 사용하기 위해 컴파일한 바이너리에도 모든 용도의 코드가 들어가게 됩니다.
그렇기에 더 나은 방법을 찾다가 go build tags 기능을 알게되었습니다.

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> 를 권장하고 있습니다.

main.go

package main

func main() {
	PrintMode()
}

case1.go

//go:build case1

package main

import "fmt"

func PrintMode() {
	fmt.Println("Case1")
}

noncase1.go

//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 는 파일 최상단에 위치해야합니다.

  • 해당 결과를 통하여 go 코드 컴파일 시 -tags 옵션으로 컴파일할 파일을 지정할 수 있다는 것을 확인할 수 있습니다.
  • 단순히 Tag 가 정의되었냐 아니냐 뿐 아니라 and, or 연산도 가능합니다.
profile
리자몽이 되고픈 파이리 데이터 엔지니어

0개의 댓글