2013-02-18 93 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) 

我想知道的是:

  1. 哪里是startTimer
  2. 真正的代码,为什么一个“抽象方法”可以在这里存在
  3. 为什么围棋的作者写的这样

谢谢!

回答

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中,这是Go和C没有很好记录的混合。

+0

@CheneyEah,请参阅[this thread](http: //groups.google.com/group/golang-nuts/browse_thread/thread/134e72302b9a3441/d44169a540437357)获得更多关于'.goc'文件的信息。 – kostix 2013-02-20 07:30:03

+1

startTimer()函数删除链接已损坏 – 2015-03-10 11:57:08