37

そのパッケージのコードを読んでいて、timeどのように機能するのか知りたいですfunc 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-それはとても奇妙なので、関数startTimerは関数本体を持っていません。

func startTimer(*runtimeTimer)

私はそれを知りたいです:

  1. の実際のコードはどこにありますかstartTimer
  2. ここに「抽象メソッド」が存在する理由
  3. Goの作者がこのように書いた理由

ありがとう!

4

1 に答える 1

44
  1. 関数はここで定義されています:

    // startTimer adds t to the timer heap.
    //go:linkname startTimer time.startTimer
    func startTimer(t *timer) {
        if raceenabled {
            racerelease(unsafe.Pointer(t))
        }
        addtimer(t)
    }
    
  2. 関数宣言

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

  3. すべてのプログラミング言語が独自のランタイムを完全に表現できるわけではありません(たとえば、Cは表現できます)。Goランタイムと標準ライブラリの一部はCであり、一部はアセンブリであり、他の一部はであり.goc、これはGoとCの十分に文書化されていないハイブリッドです。

于 2013-02-18T15:02:47.100 に答える