Maison >développement back-end >Golang >Pourquoi le package Go « time » utilise-t-il une fonction « startTimer » sans implémentation ?

Pourquoi le package Go « time » utilise-t-il une fonction « startTimer » sans implémentation ?

DDD
DDDoriginal
2024-12-18 17:21:10194parcourir

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

Appel de fonction sans corps de fonction

Lorsque vous parcourez le code du package "time" pour examiner la fonction After(d Duration) <-chan Time, vous rencontre une particularité :

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
}

La fonction startTimer ne semble pas avoir d'implémentation propre :

func startTimer(*runtimeTimer)

Questions :

  1. Où est le code réel de startTimer ?
  2. Pourquoi y a-t-il une « méthode abstraite » ?
  3. Quelles raisons le développeur Go avait-il pour cela Conception ?

Réponses :

  1. Emplacement du code réel :

    Le le code de startTimer se trouve dans la routine d'assemblage suivante défini :

    //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. Méthodes abstraites dans Go :

    Dans Go, les déclarations de fonction peuvent omettre le corps de la fonction. Ces déclarations spécifient uniquement la signature d'une fonction implémentée en dehors de Go, par ex. B. en tant que routine d'assemblage.

  3. Raisons de la conception :

    Tous les langages de programmation ne peuvent pas exprimer pleinement leur propre environnement d'exécution. Certaines parties du runtime Go et de la bibliothèque standard sont écrites en C, certaines parties en assembleur et d'autres en ".goc", un mélange peu documenté de Go et C.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn