Beim Durchstöbern des Codes des Pakets "time" zur Untersuchung der Funktion After(d Duration) <-chan Time stößt man auf eine Besonderheit:
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 }
Die Funktion startTimer scheint keine Implementierung zu besitzen:
func startTimer(*runtimeTimer)
Fragen:
Antworten:
Fundort des tatsächlichen Codes:
Der Code von startTimer ist in der folgenden Assembly-Routine definiert:
//go:linkname startTimer time.startTimer // startTimer adds t to the timer heap. func startTimer(t *timer) { if raceenabled { racerelease(unsafe.Pointer(t)) } addtimer(t) }
Abstrakte Methoden in Go:
In Go können Funktionsdeklarationen den Funktionsrumpf weglassen. Diese Deklarationen geben nur die Signatur einer Funktion an, die außerhalb von Go implementiert wird, z. B. als Assembleroutine.
Gründe für das Design:
Nicht alle Programmiersprachen können ihre eigene Laufzeit vollständig ausdrücken. Teile der Go-Laufzeit und der Standardbibliothek sind in C, Teile in Assembler und andere in ".goc" geschrieben, einer nicht umfassend dokumentierten Mischung aus Go und C.
Das obige ist der detaillierte Inhalt vonWarum verwendet das Go-Paket „time' eine implementiertungslose „startTimer'-Funktion?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!