当前位置: 首页 > 知识库问答 >
问题:

是否可以在Golang中内联函数,包含循环?

江礼骞
2023-03-14

例如,我在golang中进行了以下测试:

// inline-tests.go
package inlinetests

func plus(a, b int) int {
    return a + b
}

func plus_plus(a, b, c int) int {
    return plus(plus(a, b), plus(b, c))
}

func plus_iter(l ...int) (res int) {
    for _, v := range l {
        res += v
    }
    return
}

如果我尝试构建它,我会收到以下内容:

go build -gcflags=-m inline-tests.go
# command-line-arguments
./inline-tests.go:4: can inline plus
./inline-tests.go:8: can inline plus_plus
./inline-tests.go:9: inlining call to plus
./inline-tests.go:9: inlining call to plus
./inline-tests.go:9: inlining call to plus
./inline-tests.go:12: plus_iter l does not escape

有没有办法让编译器内联plus_iter?如果是,是否有任何方法可以内联映射迭代?

共有2个答案

鲜于温书
2023-03-14

从go版本1.16开始:https://golang.org/doc/go1.16#compiler

编译器现在可以使用未标记的循环、方法值和类型开关内联函数。内联还可以检测更多可能内联的间接调用。

柯书
2023-03-14

去维基

编译器优化

函数内联

只有简短的函数是内联的。要进行内联,函数必须包含少于40个表达式,并且不包含复杂的内容,如函数调用、循环、标签、闭包、panic、recover、select、switch等。

目前,带有循环的函数不是内联的。

 类似资料:
  • 问题内容: 我有以下测试方法,该方法使用从包中导入的函数。 可以在golang中进行模拟吗? 问题答案: 是的,只需进行简单的重构即可。创建一个函数类型的变量,用初始化,并让您的包调用而不是: 在测试中,您可以为分配另一个功能,该功能是在测试中定义的,并且可以执行测试所需的功能。 例如:

  • 问题内容: Go代码中可以包含内联汇编吗? 问题答案: 不支持内联汇编,但是您可以链接通过C用汇编语言编写的代码,使用cgo进行编译和使用,例如gmp.go中的代码。您也可以使用与Go直接兼容的汇编样式来编写,例如asm_linux_amd64.s中,它要求函数名称以“·”开头。 或者,您可以使用nasm和gccgo,这是我到目前为止最喜欢的方法。(请注意,Nasm似乎不支持以“·”开头的功能)。

  • 问题内容: 我想知道是否可以在Go中为未知数量的变量定义函数。 像这样 我想对任意数量的输入进行泛化。 问题答案: 据我所知,您已经了解了很多,但是语法是。见规格: 给定功能并调用 在Greeting中,将具有价值

  • 问题内容: 我想知道是否可以在Swift中编写内联汇编。 我知道在Objective-C中,您可以使用如下代码: 但是在Swift中似乎无法使用 。 有谁知道如何使用,如果可能的话。我没有找到任何关于它的信息,所以我认为这是一个很好的问题。 问题答案: 要扩展Robert Levy所说的内容,您可以只使用Swift / Obj-C互操作功能,并编写一个可以处理ASM内容的Obj- C类,然后可以从

  • 问题内容: 我有这样的JavaScript: 这是行不通的,因为在成功功能的上下文中“ this”没有意义。有一个优雅的解决方案吗? 问题答案: 您正在寻找方法的参数。 它允许您设置将在其中调用所有回调的上下文。

  • 问题内容: 我知道可以将AngularJs和Maven包含到一个Spring项目中,但是如何将其包含在Gradle中呢? 查看gradle存储库,我没有找到AngularJs条目。也许可以使用Gradle从Maven存储库中获取它?但是,如何做到这一点。 问题答案: 尽管在下面的讨论中发现,通过gradle下载angular没有意义,但是可以使用以下代码完成: