Apabila menyemak imbas kod pakej "masa" untuk memeriksa fungsi Selepas(d Tempoh) <-chan Masa, anda menemui satu keanehan:
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 }
Fungsi startTimer nampaknya tidak mempunyai pelaksanaan own:
func startTimer(*runtimeTimer)
Soalan:
Jawapan:
Lokasi kod sebenar:
The kod startTimer berada dalam rutin pemasangan berikut ditakrifkan:
//go:linkname startTimer time.startTimer // startTimer adds t to the timer heap. func startTimer(t *timer) { if raceenabled { racerelease(unsafe.Pointer(t)) } addtimer(t) }
Kaedah abstrak dalam Go:
Dalam Go, pengisytiharan fungsi boleh menghilangkan badan fungsi. Pengisytiharan ini hanya menyatakan tandatangan fungsi yang dilaksanakan di luar Go, mis. B. sebagai rutin pemasangan.
Sebab reka bentuk:
Bukan semua bahasa pengaturcaraan boleh menyatakan sepenuhnya masa jalan mereka sendiri. Sebahagian daripada masa jalanan Go dan pustaka standard ditulis dalam C, bahagian dalam pemasang dan lain-lain dalam ".goc", gabungan Go dan C yang tidak didokumenkan secara menyeluruh.
Atas ialah kandungan terperinci Mengapa Pakej Go `time` Menggunakan Fungsi `startTimer` tanpa Pelaksanaan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!