「time」パッケージのコードを参照して関数 After(d Duration) <-chan Time を調べるとき、特殊な点に遭遇しました:
func After(d Duration) <-chan Time { return NewTimer(d).C } func NewTimer(d Duration) *Timer { c := make(chan Time, 1) t := &Timer{ C: c, r: runtimeTimer{ when: nano() + int64(d), f: sendTime, arg: c, }, } startTimer(&t.r) return t }
startTimer 関数には実装がないようです自分:
func startTimer(*runtimeTimer)
質問:
答え:
実際のコードの場所:
startTimer のコードは次のアセンブリ ルーチンにあります定義:
//go:linkname startTimer time.startTimer // startTimer adds t to the timer heap. func startTimer(t *timer) { if raceenabled { racerelease(unsafe.Pointer(t)) } addtimer(t) }
Go の抽象メソッド:
Go では、関数宣言で関数本体を省略できます。これらの宣言は、Go の外部で実装された関数の署名のみを指定します。 B. アセンブリ ルーチンとして。
設計の理由:
すべてのプログラミング言語が独自のランタイムを完全に表現できるわけではありません。 Go ランタイムと標準ライブラリの一部は C で書かれ、一部はアセンブラで書かれ、その他の部分は ".goc" で書かれています。これは、Go と C の包括的な文書化がされていないものです。
以上がGo `time` パッケージが実装不要の `startTimer` 関数を使用するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。