Go 使用编译器技巧

Go 使用编译器技巧,go,Go,我在一篇演讲中读到,Go编译器将积极删除输出二进制文件中未使用的代码。我找不到的谈话用它来添加一些对测试有用的代码。有没有人有更多关于这是如何工作的信息?有关于高级测试技术的讨论吗?戴夫·切尼在他的基准博客文章中谈到了这一点: 关于编译器优化的注记 死码消除 func Test() bool { return false } func Expensive() { if Test() { // something expensive } } 在本例中,尽管函数测试总是返回

我在一篇演讲中读到,Go编译器将积极删除输出二进制文件中未使用的代码。我找不到的谈话用它来添加一些对测试有用的代码。有没有人有更多关于这是如何工作的信息?有关于高级测试技术的讨论吗?

戴夫·切尼在他的基准博客文章中谈到了这一点:

关于编译器优化的注记

死码消除

func Test() bool { return false }

func Expensive() {
  if Test() {
      // something expensive
  }
}
在本例中,尽管函数测试总是返回false, 如果不执行它,我们就无法知道这一点

当测试内联时,我们得到如下结果

func Expensive() {
  if false {
      // something expensive is
      // now unreachable
  }
}
编译器现在知道昂贵的代码是无法访问的

这不仅节省了调用测试的成本,还节省了编译 或者运行任何现在无法访问的昂贵代码

例如,添加一些对测试有用的代码

func Complicated() {
    if Test() {
        // something for testing
    }
}
开关试验

内联

func Complicated() {
    if false {
        // something for testing
        // unreachable
    }
}
func Complicated() {
    if true {
        // something for testing
        // reachable
    }
}

内联

func Complicated() {
    if false {
        // something for testing
        // unreachable
    }
}
func Complicated() {
    if true {
        // something for testing
        // reachable
    }
}

包含用于测试的代码可能很有用。

看看这里关于Go的各种讨论:无法回答所有这些问题,但将结果分配给全局是确保代码不会优化的一种方法。当然,Dave Cheney会在最后介绍它,实际上,const Test=false可能是一个更好的选择。我缺少的部分是如何在不修改源代码的情况下切换此选项进行测试?@Drew当然您必须修改源代码,但只需修改一行。如果二进制文件不在源代码级别,编译器将如何从中删除它?我的意思是,是的,存在自修改二进制文件,但是。。。