2016-04-05 19 views
3

Golang GitHubリポジトリの数学パッケージでスキミングしました。その中には、2つの異なる関数宣言があります。以下のコードでは、sqrt.goSqrtsqrtfuncです。私の質問は次のとおりです: なぜこのように実装していますか?メリットは何ですか?これは、エクスポートされた識別子とエクスポートされていない識別子(小文字と大文字の最初の文字)のためですか?Goの説明でエクスポートされ、エクスポートされていません

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()

+2

あなたが引用したコメントは、あなたの質問に対する答えです。このコメントが不明な点は何ですか? – Volker

答えて

4

あなたはfirst line of the code you quotedに示しように、本体のないspec、関数宣言によると、ゴーの外に実装されたコードの宣言を提供すること。通常はアセンブリ言語または別の言語で表示されます。

この場合、ほとんどの実装はfunc Sqrt(x float64) float64です。例えばAMD64から386amd64armなど

サンプル:

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

何のアセンブリの実装アセンブリは、単に移動しているプラ​​イベート/アンエクスポートfunc sqrt(x float64) float64バージョンを参照していないアーキテクチャの場合。例えば、mips64アーキテクチャ。

TEXT ·Sqrt(SB),NOSPLIT,$0 
    JMP ·sqrt(SB) 
関連する問題