在Go解释

时间:2016-04-05 15:18:36

标签: go

我在Golang GitHub repo中浏览了数学包。其中一些有两个不同的函数声明。在下面的代码中,sqrt.goSqrtsqrt个func。我的问题是: 他们为什么这样实现呢?有什么好处?这是因为导出和未导出的标识符(小写与大写首字母)?

func Sqrt(x float64) float64

// Note: Sqrt is implemented in assembly on some systems.
// Others have assembly stubs that jump to func sqrt below.
// On systems where Sqrt is a single instruction, the compiler
// may turn a direct call into a direct use of that instruction instead.

func sqrt(x float64) float64 {

math.Sqrt()

1 个答案:

答案 0 :(得分:4)

根据spec,没有正文的函数声明(如first line of the code you quoted所示)为Go外部实现的代码提供声明;通常是集会或其他语言。

在这种情况下,func Sqrt(x float64) float64的大部分实现都在汇编中;例如386amd64arm

来自amd64的样本:

// func Sqrt(x float64) float64
TEXT ·Sqrt(SB),NOSPLIT,$0
    SQRTSD x+0(FP), X0
    MOVSD X0, ret+8(FP)
    RET

对于没有程序集实现的体系结构,程序集只是引用Go中的未导出/私有func sqrt(x float64) float64版本。例如mips64架构。

TEXT ·Sqrt(SB),NOSPLIT,$0
    JMP ·sqrt(SB)