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 :
Réponses :
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) }
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.
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!