与C++等语言不同的是,在Go中你不能显式地声明inline
,而是由编译器动态检测适合进行内联的函数(C++也能做到,但Go不能同时实现两者)。此外,有一个调试选项可以查看可能发生的内联情况,然而关于Go编译器确切逻辑的记录在网上非常少。
比如说,我需要每n周期对一组数据重新运行一次大型循环;
func Encrypt(password []byte) ([]byte, error) {
return bcrypt.GenerateFromPassword(password, 13)
}
for id, data := range someDataSet {
newPassword, _ := Encrypt([]byte("generatedSomething"))
data["password"] = newPassword
someSaveCall(id, data)
}
如果我想要让Encrypt
被正确地内联,那么编译器需要考虑哪些逻辑?
我知道在C ++中,通过引用传递将增加自动内联的可能性,而不需要显式使用inline
关键字,但很难理解编译器在Go中具体做出选择的决策。例如,像PHP这样的脚本语言在执行包含一个常量addSomething($a, $b)
的循环时会受到极大的影响,其中对于像这样的十亿次运算,与$a + $b
(内联)相比,成本几乎是荒谬的。