//go:build *
foo.gobar.go
//go:build foo

// this is foo.go
package debug

import "fmt"

const FooEnabled = true

func Print(){
    fmt.Println("foo")
}
//go:build !foo

// this is bar.go

package debug

import "fmt"

const FooEnabled = false 

func Print(){
    fmt.Println("bar")
}
!foo
package main

import "./debug"

func main(){
    debug.Print()
}
bar
$ GO111MODULE=off go run main.go
bar
-tagsfoo.go
$ GO111MODULE=off go run -tags foo main.go
foo
CGolang
Golangracefoo.gobar.goFooEnabledmain.go
func main() {
    if debug.FooEnabled {
        fmt.Println("foo flow")
    }
}
main.godebug.FooEnabledfalse
$ GO111MODULE=off go build  -gcflags=-S main.go

# command-line-arguments
"".main STEXT nosplit size=1 args=0x0 locals=0x0 funcid=0x0 align=0x0
    0x0000 00000 (main.go:9)    TEXT    "".main(SB), NOSPLIT|ABIInternal, $0-0
    0x0000 00000 (main.go:9)    FUNCDATA    $0, gclocals·33cdeccccebe80329f1fdbee7f5874cb(SB)
    0x0000 00000 (main.go:9)    FUNCDATA    $1, gclocals·33cdeccccebe80329f1fdbee7f5874cb(SB)
    0x0000 00000 (main.go:13)   RET
    0x0000 c3                                               .
main
$ GO111MODULE=off go build -tags foo -gcflags=-S main.go
# command-line-arguments
"".main STEXT size=103 args=0x0 locals=0x40 funcid=0x0 align=0x0
    0x0000 00000 (main.go:9)    TEXT    "".main(SB), ABIInternal, $64-0
    0x0000 00000 (main.go:9)    CMPQ    SP, 16(R14)
    0x0004 00004 (main.go:9)    PCDATA  $0, $-2
    0x0004 00004 (main.go:9)    JLS 92
    0x0006 00006 (main.go:9)    PCDATA  $0, $-1
    0x0006 00006 (main.go:9)    SUBQ    $64, SP
    0x000a 00010 (main.go:9)    MOVQ    BP, 56(SP)
    0x000f 00015 (main.go:9)    LEAQ    56(SP), BP
    0x0014 00020 (main.go:9)    FUNCDATA    $0, gclocals·33cdeccccebe80329f1fdbee7f5874cb(SB)
    0x0014 00020 (main.go:9)    FUNCDATA    $1, gclocals·f207267fbf96a0178e8758c6e3e0ce28(SB)
    0x0014 00020 (main.go:9)    FUNCDATA    $2, "".main.stkobj(SB)
    0x0014 00020 (main.go:11)   MOVUPS  X15, ""..autotmp_8+40(SP)
    0x001a 00026 (main.go:11)   LEAQ    type.string(SB), DX
    0x0021 00033 (main.go:11)   MOVQ    DX, ""..autotmp_8+40(SP)
    0x0026 00038 (main.go:11)   LEAQ    ""..stmp_0(SB), DX
    0x002d 00045 (main.go:11)   MOVQ    DX, ""..autotmp_8+48(SP)
    0x0032 00050 (<unknown line number>)  NOP
    0x0032 00050 ($GOROOT/src/fmt/print.go:274) MOVQ    os.Stdout(SB), BX
    0x0039 00057 ($GOROOT/src/fmt/print.go:274) LEAQ    go.itab.*os.File,io.Writer(SB), AX
    0x0040 00064 ($GOROOT/src/fmt/print.go:274) LEAQ    ""..autotmp_8+40(SP), CX
    0x0045 00069 ($GOROOT/src/fmt/print.go:274) MOVL    $1, DI
    0x004a 00074 ($GOROOT/src/fmt/print.go:274) MOVQ    DI, SI
    0x004d 00077 ($GOROOT/src/fmt/print.go:274) PCDATA  $1, $0
    0x004d 00077 ($GOROOT/src/fmt/print.go:274) CALL    fmt.Fprintln(SB)
    0x0052 00082 (main.go:13)   MOVQ    56(SP), BP
    0x0057 00087 (main.go:13)   ADDQ    $64, SP
    0x005b 00091 (main.go:13)   RET
    0x005c 00092 (main.go:13)   NOP
    0x005c 00092 (main.go:9)    PCDATA  $1, $-1
    0x005c 00092 (main.go:9)    PCDATA  $0, $-2
    0x005c 00092 (main.go:9)    NOP
    0x0060 00096 (main.go:9)    CALL    runtime.morestack_noctxt(SB)
    0x0065 00101 (main.go:9)    PCDATA  $0, $-1
    0x0065 00101 (main.go:9)    JMP 0

可以看到这部分生成了打印语句的代码,综上所述,如果想根据编译选项来生成不同的代码,而不是在运行时进行判断,可以根据场景灵活地实现。