我正在阅读包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
谢谢!
答案 0 :(得分:25)
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)
}
函数声明可以省略正文。这样的声明为Go外部实现的函数提供了签名,例如汇编例程。
3)并非每种编程语言都能完全表达自己的运行时(例如,C可以)。 Go运行时和标准库的一部分在C中,部分在汇编中,而另一些在.goc
中,这是一个没有很好记录的Go和C混合。