37

我正在阅读 package 的代码,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.

于 2013-02-18T15:02:47.100 回答