我在Golang GitHub repo中浏览了数学包。其中一些有两个不同的函数声明。在下面的代码中,sqrt.go
有Sqrt
和sqrt
个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()
答案 0 :(得分:4)
根据spec,没有正文的函数声明(如first line of the code you quoted所示)为Go外部实现的代码提供声明;通常是集会或其他语言。
在这种情况下,func Sqrt(x float64) float64
的大部分实现都在汇编中;例如386,amd64,arm等
来自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)