Golang Go语言中怎么在release版本避免编译一些代码?

发布于 1周前 作者 bupafengyu 来自 Go语言

在 C/C++中,一般都是用一个宏来将 release 版本不需要的代码过滤掉

在 go 中好像没有找到相关的方法,搜了一圈也没找到合适的方法


Golang Go语言中怎么在release版本避免编译一些代码?
18 回复

可以用 go build -ldflags ‘-X main.Env=release’,然后在 main package 里定义 Env ,判断 Env 是否 release 来写代码

更多关于Golang Go语言中怎么在release版本避免编译一些代码?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


对,搜到这个方法了,但是不清楚编译器会不会自动去除掉这部分代码的编译。
逻辑上是没什么问题的。

在文件头加上 // +abcd 后,可以用 go build -tag 'abcd’触发这个文件的编译。如果没有 abcd 这个 tag ,就不编译。

是 go build -tags ‘abcd’

大致了解了一下,好像是文件级别的,用于跨平台。
我想在 debug 的时候,日志记录代码行号, release 的里面不记录。
这种做法的话,就需要定义两个同名函数在不同的文件中吧,大概?
请问,有行级别生效的方法吗?

file debug
// +build dev
const DEVELOPMENT = true

file release
// +build !dev
const DEVELOPMENT = false

other files
if DEVELOPMENT {

}

和 的 idea 类似,可能编译后的逻辑中还是会多个判断。
看样子就只能这样了,感谢各位。

对啊,就是定义相同的函数,不同 tag 用不同的。如果有共用的代码,就放到没有 tag 的文件里。不用加条件的

log_debug.go
// +build debug

// 带行号的 log 函数或方法
func log …

log_release.go
// +build !debug
// 不带行号的
func log …

其他文件直接调用 log ,不用加 if

如果 debug 和 release 的 log 函数有很多相同的逻辑,那就提取出来,放在 log.go 里,然后在 log_debug.go 和 log_release.go 里分别包装一下。

是的,看了您提供的资料后,现在就是这么做的,谢谢。

像有没有行号这种应该在程序配置里搞定会更合理一点。 debug 和 release 使用不同配置即可。

我想在 release 版本中尽量避免不必要的逻辑

编译期会移除死代码的,你可以 dump 汇编来看

C/CPP 的编译器会, golang 的我还不太清楚,每次编译都好大一个文件,都不知道有些啥。

编译好大的文件是因为 go 默认把 dwarf 编译进去了,编译的时候-ldflags '-s -w’就可以了,会减少大概 50%的体积。

//+build 就可以,目前 golang 的控制精度应该只到文件。。。还要更细致的话就比较麻烦了

在Golang(Go语言)中,为了在release版本避免编译一些代码,你可以利用构建标签(Build Tags)和条件编译来实现。这是一种常见的方法,可以确保特定代码块只在特定构建条件下被编译。

  1. 使用构建标签: 构建标签允许你指定哪些文件或代码块应该包含在特定的构建中。你可以在源代码文件的开头添加 // +build 注释来指定构建标签。例如,如果你有一些调试代码,只希望在debug模式下编译,可以这样标记:

    // +build debug
    
    package main
    
    import "fmt"
    
    func init() {
        fmt.Println("This is debug code.")
    }
    

    当你运行 go build -tags debug 时,这段代码会被编译;而在release版本(即没有指定debug标签时)则不会。

  2. 条件编译: 在代码中,你也可以使用 build.Default.Tags 或自定义逻辑来动态判断当前是否处于特定的构建环境,从而决定是否执行某些代码。虽然这种方法不如构建标签直接,但在某些复杂场景下可能会用到。

  3. 构建脚本: 通过编写构建脚本,你可以更灵活地控制编译过程,包括是否包含某些代码文件或代码块。

总之,利用构建标签是避免在release版本中编译特定代码的最直接和推荐的方法。这种方法简单有效,且能很好地与Go的构建系统集成。

回到顶部