Heim >Backend-Entwicklung >Golang >Warum verwendet das Go-Paket „time' eine implementiertungslose „startTimer'-Funktion?

Warum verwendet das Go-Paket „time' eine implementiertungslose „startTimer'-Funktion?

DDD
DDDOriginal
2024-12-18 17:21:10243Durchsuche

Why Does the Go `time` Package Use an Implementation-less `startTimer` Function?

Funktionsaufruf ohne Funktionsrumpf

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:

  1. Wo befindet sich der tatsächliche Code von startTimer?
  2. Warum gibt es hier eine "abstrakte Methode"?
  3. Welche Gründe hatte der Go-Entwickler für dieses Design?

Antworten:

  1. 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)
    }
  2. 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.

  3. 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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn