Rumah >pembangunan bahagian belakang >Golang >Mengapa Pakej Go `time` Menggunakan Fungsi `startTimer` tanpa Pelaksanaan?

Mengapa Pakej Go `time` Menggunakan Fungsi `startTimer` tanpa Pelaksanaan?

DDD
DDDasal
2024-12-18 17:21:10204semak imbas

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

Panggilan fungsi tanpa badan fungsi

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:

  1. Di manakah kod sebenar startTimer?
  2. Mengapa terdapat "Kaedah abstrak" ?
  3. Apakah sebab pembangun Go untuk perkara ini Reka bentuk?

Jawapan:

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

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

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn