2013-02-18 24 views
15

パッケージ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) 

私はそれを知りたい:startTimer

  • の実際のコードで行くの著者はこのようにそれを書いたのはなぜ「抽象メソッド」缶がここ
  • が存在するのはなぜ

    ありがとう!

  • 答えて

    22

    1)関数がhereに定義される:

    // 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)Function declarations

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

    3)すべてのプログラミング言語が独自のランタイムを完全に表現できるわけではありません(C言語など)。 Goランタイムと標準ライブラリの一部はC言語で、部品はアセンブルされていますが、他の言語は.gocにあります。

    +0

    @CheneyEah、[this thread](http: '.goc'ファイルの詳細については、//groups.google.com/group/golang-nuts/browse_thread/thread/134e72302b9a3441/d44169a540437357)をご覧ください。 – kostix

    +1

    startTimer()関数の宣言リンクが壊れています –

    関連する問題