ホームページ > バックエンド開発 > Golang > Go `time` パッケージが実装不要の `startTimer` 関数を使用するのはなぜですか?

Go `time` パッケージが実装不要の `startTimer` 関数を使用するのはなぜですか?

DDD
リリース: 2024-12-18 17:21:10
オリジナル
188 人が閲覧しました

Why Does the Go `time` Package Use an Implementation-less `startTimer` Function?

関数本体のない関数呼び出し

「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)
ログイン後にコピー

質問:

  1. startTimer の実際のコードはどこですか?
  2. なぜ「抽象メソッド」があるのですか? ?
  3. Go 開発者はこれについてどのような理由を考えましたか?設計?

答え:

  1. 実際のコードの場所:

    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)
    }
    ログイン後にコピー
  2. Go の抽象メソッド:

    Go では、関数宣言で関数本体を省略できます。これらの宣言は、Go の外部で実装された関数の署名のみを指定します。 B. アセンブリ ルーチンとして。

  3. 設計の理由:

    すべてのプログラミング言語が独自のランタイムを完全に表現できるわけではありません。 Go ランタイムと標準ライブラリの一部は C で書かれ、一部はアセンブラで書かれ、その他の部分は ".goc" で書かれています。これは、Go と C の包括的な文書化がされていないものです。

以上がGo `time` パッケージが実装不要の `startTimer` 関数を使用するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート