首頁 >後端開發 >Golang >為什麼 Go `time` 套件使用無實作的 `startTimer` 函數?

為什麼 Go `time` 套件使用無實作的 `startTimer` 函數?

DDD
DDD原創
2024-12-18 17:21:10205瀏覽

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

沒有函數體的函數呼叫

當瀏覽「time」套件的程式碼來檢查函數After(d Duration)

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
}

startTimer函數似乎沒有實現自己的:

func startTimer(*runtimeTimer)

問題:

  1. startTimer的實際程式碼在哪裡?
  2. 為什麼會有一個「抽象方法」 ?
  3. Go 開發者這樣做有什麼原因設計?

答案:

  1. 實際程式碼位置:

    實際程式碼位置:
    //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. startTimer的程式碼在下面的組譯程式中定義:

    Go 中的抽象方法:
  3. Go 中,函數宣告可以省略函數體。這些聲明僅指定在 Go 外部實作的函數的簽名,例如B. 作為彙編例程。

    設計原因:
並不是所有的程式語言都能完全表達自己的執行時間。 Go 運行時和標準庫的一部分是用 C 編寫的,一部分是用彙編程式編寫的,其他部分是用「.goc」編寫的,「.goc」是 Go 和 C 的未完整記錄的混合。

以上是為什麼 Go `time` 套件使用無實作的 `startTimer` 函數?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn