Golang数学パッケージフロアに関数本体がありません



Golang Math Package Floor Missing Function Body



ときどき、mathパッケージでいくつかの関数をテストしたいのですが、mathパッケージでエクスポートされた関数に関数本体がないことがわかりました。私はこのコードに従い、自分の.goファイルでエラーを報告します。missing function body

コードは次のように長くなります。



// Trunc returns the integer value of x. // // Special cases are: // Trunc(±0) = ±0 // Trunc(±Inf) = ±Inf // Trunc(NaN) = NaN func Trunc(x float64) float64 func trunc(x float64) float64 { if x == 0 || IsNaN(x) || IsInf(x, 0) { return x } d, _ := Modf(x) return d }

2つの質問:

  1. func Trunc(x float64) float64この種の書き方はトリックです。文法はどこにあり、ソースは
  2. 次のエクスポートされていない関数が実装されましたfunc trunc(x float64) float64 {...}この機能とはどのような関係がありますか?

あれは何でしょう

まず第一に、これはトリックです。実際、これは関数宣言です。実際の関数本体はアセンブリの実装です。ソースコードを見ると、この関数はmathパッケージの下のfloor.goファイルから取得されます。ファイルが配置されているフォルダーには、次のファイルが含まれます。



floor_386.s floor_amd64.s floor_amd64p32.s floor_arm.s floor_arm64.s floor_ppc64x.s floor_s390x.s floor_wasm.s

floor.goの関数宣言は、アセンブリファイルに実装されています。

文法ソースはリファレンスです golang仕様 原則は

関数宣言では本文を省略できます。このような宣言は、アセンブリルーチンなど、Goの外部で実装された》関数のシグネチャを提供します。



func min(x int, y int) int { if x < y { return x } return y } func flushICache(begin, end uintptr) // implemented externally

一般的な考え方は、関数宣言で本体を省略できるというものです。このような宣言は、アセンブラなど、Goの外部でこの関数を実装するための署名を提供するためのものです。

協会

func trunc(x float64) float64 {...}この声明との関係は何ですか?

参照リンクによると、これはgolangの代替実装です。たとえば、floor_arm.sにTruncを実装する場合、golangの実装と呼ばれ、参照およびテストとしても使用できます。

floor_arm.s

#include 'textflag.h' TEXT ·Floor(SB),NOSPLIT,$0 B ·floor(SB) TEXT ·Ceil(SB),NOSPLIT,$0 B ·ceil(SB) TEXT ·Trunc(SB),NOSPLIT,$0 B ·trunc(SB)

ここ.truncなどはgolang実装と呼ばれます

参照リンク:

Golangのボディレス機能

golang仕様-関数宣言